Xcode 调试器在 JavaScriptCore 的回调函数中挂起
Xcode debugger hangs in callback function from JavaScriptCore
更新
在Xcode8.0
中固定
环境
Xcode7.3.1,iPhoneSE,iOS9.3.5
问题
我通过 JSObjectMakeFunctionWithCallback
使用 JavaScript 核心框架将 C 函数绑定到 JavaScript 函数。
如果我在这个 C 函数中放置断点,
Xcode 当执行位置来自 JavaScript by JSEvaluateScript
时调试器挂起。
- 我想知道问题的原因。
- 我想知道实现 C 函数的方法,它可以正确处理断点并且可以从 JavaScript 环境中调用。
我不需要想法使用 Objective-C API,
因为我想与 iOS 和 Android.
共享代码
条件
根据我的实验,我得到了这些条件。
- 在 iOS 模拟器中不会发生。
- 从
JSObjectCallAsFunction
调用JS函数时不会发生。
- 当 JS 函数从
JSEvaluateScript
调用时发生。
我通过查看模拟器中的调用堆栈得出的意见 运行ning 是
此问题来自 JavaScriptCore 的 JIT/LLINT 嵌入式程序集。
我猜想这些程序集缺少一些与调试机制相关的东西。
所以我担心 JavaScriptCode.
用户端的程序员没有解决方案
可重现的源代码
我在此存储库中打包了可重现的小示例。
https://github.com/omochi/jscore-debugger-hangup
步数
- 克隆此存储库。
- 打开 Xcode。
- 打开
test_main.c
。
- 在
TestNativeFunc
中的 printf
和 TestMain
中的 JSEvaluateScript
处放置断点。
- 运行申请。
- 它在
printf
处暂停。
- 继续。
- 它在
JSEvaluateScript
处暂停了。
- Xcode 挂起。
如果删除两个断点,它 运行 正确并打印两条 func
消息。
代码
static JSValueRef TestNativeFunc(JSContextRef ctx,
JSObjectRef function,
JSObjectRef thisObject,
size_t argumentCount,
const JSValueRef arguments[],
JSValueRef* exception)
{
printf("func\n");
return JSValueMakeNull(ctx);
}
void TestMain() {
JSGlobalContextRef context = JSGlobalContextCreate(NULL);
JSObjectRef func = JSObjectMakeFunctionWithCallback(context, NULL, &TestNativeFunc);
JSValueProtect(context, func);
JSObjectCallAsFunction(context, func, NULL, 0, NULL, NULL);
JSObjectRef global_object = JSContextGetGlobalObject(context);
JSStringRef f_str = JSStringCreateWithUTF8CString("f");
JSObjectSetProperty(context, global_object, f_str, func, 0, NULL);
JSStringRef script = JSStringCreateWithUTF8CString("f();");
JSEvaluateScript(context, script, NULL, NULL, 1, NULL);
JSStringRelease(f_str);
JSValueUnprotect(context, func);
JSGlobalContextRelease(context);
}
这是 Xcode 7.3.1 中的已知错误,应在 Xcode 8.0 中修复。如果您发现不是在您有机会升级到 8.0 时,请使用 http://bugreporter.apple.com.
提交错误
更新
在Xcode8.0
中固定环境
Xcode7.3.1,iPhoneSE,iOS9.3.5
问题
我通过 JSObjectMakeFunctionWithCallback
使用 JavaScript 核心框架将 C 函数绑定到 JavaScript 函数。
如果我在这个 C 函数中放置断点,
Xcode 当执行位置来自 JavaScript by JSEvaluateScript
时调试器挂起。
- 我想知道问题的原因。
- 我想知道实现 C 函数的方法,它可以正确处理断点并且可以从 JavaScript 环境中调用。
我不需要想法使用 Objective-C API, 因为我想与 iOS 和 Android.
共享代码条件
根据我的实验,我得到了这些条件。
- 在 iOS 模拟器中不会发生。
- 从
JSObjectCallAsFunction
调用JS函数时不会发生。 - 当 JS 函数从
JSEvaluateScript
调用时发生。
我通过查看模拟器中的调用堆栈得出的意见 运行ning 是 此问题来自 JavaScriptCore 的 JIT/LLINT 嵌入式程序集。 我猜想这些程序集缺少一些与调试机制相关的东西。 所以我担心 JavaScriptCode.
用户端的程序员没有解决方案可重现的源代码
我在此存储库中打包了可重现的小示例。
https://github.com/omochi/jscore-debugger-hangup
步数
- 克隆此存储库。
- 打开 Xcode。
- 打开
test_main.c
。 - 在
TestNativeFunc
中的printf
和TestMain
中的JSEvaluateScript
处放置断点。 - 运行申请。
- 它在
printf
处暂停。 - 继续。
- 它在
JSEvaluateScript
处暂停了。 - Xcode 挂起。
如果删除两个断点,它 运行 正确并打印两条 func
消息。
代码
static JSValueRef TestNativeFunc(JSContextRef ctx,
JSObjectRef function,
JSObjectRef thisObject,
size_t argumentCount,
const JSValueRef arguments[],
JSValueRef* exception)
{
printf("func\n");
return JSValueMakeNull(ctx);
}
void TestMain() {
JSGlobalContextRef context = JSGlobalContextCreate(NULL);
JSObjectRef func = JSObjectMakeFunctionWithCallback(context, NULL, &TestNativeFunc);
JSValueProtect(context, func);
JSObjectCallAsFunction(context, func, NULL, 0, NULL, NULL);
JSObjectRef global_object = JSContextGetGlobalObject(context);
JSStringRef f_str = JSStringCreateWithUTF8CString("f");
JSObjectSetProperty(context, global_object, f_str, func, 0, NULL);
JSStringRef script = JSStringCreateWithUTF8CString("f();");
JSEvaluateScript(context, script, NULL, NULL, 1, NULL);
JSStringRelease(f_str);
JSValueUnprotect(context, func);
JSGlobalContextRelease(context);
}
这是 Xcode 7.3.1 中的已知错误,应在 Xcode 8.0 中修复。如果您发现不是在您有机会升级到 8.0 时,请使用 http://bugreporter.apple.com.
提交错误