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 时调试器挂起。

我不需要想法使用 Objective-C API, 因为我想与 iOS 和 Android.

共享代码

条件

根据我的实验,我得到了这些条件。

我通过查看模拟器中的调用堆栈得出的意见 运行ning 是 此问题来自 JavaScriptCore 的 JIT/LLINT 嵌入式程序集。 我猜想这些程序集缺少一些与调试机制相关的东西。 所以我担心 JavaScriptCode.

用户端的程序员没有解决方案

可重现的源代码

我在此存储库中打包了可重现的小示例。

https://github.com/omochi/jscore-debugger-hangup

步数

  1. 克隆此存储库。
  2. 打开 Xcode。
  3. 打开test_main.c
  4. TestNativeFunc 中的 printfTestMain 中的 JSEvaluateScript 处放置断点。
  5. 运行申请。
  6. 它在 printf 处暂停。
  7. 继续。
  8. 它在 JSEvaluateScript 处暂停了。
  9. 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.

提交错误