簡體   English   中英

Xcode調試器在JavaScriptCore的回調函數中掛起

[英]Xcode debugger hangs in callback function from JavaScriptCore

更新

它在Xcode 8.0中修復


環境

Xcode 7.3.1,iPhone SE,iOS 9.3.5

問題

我使用JavaScriptCore框架通過JSObjectMakeFunctionWithCallback將C函數綁定到JavaScript函數。 如果我在這個C函數中放置斷點,當JSEvaluateScript從JavaScript進入執行位置時,Xcode調試器會掛起。

  • 我想知道問題的原因。
  • 我想知道實現正確使用斷點的C函數的方法,並且可以從JavaScript環境中調用。

我不需要使用Objective-C API,因為我想與iOS和Android共享代碼。

條件

從我的實驗中,我得到了這些條件。

  • 它不會發生在iOS模擬器中。
  • 當JS函數從JSObjectCallAsFunction調用時,它不會發生。
  • 它發生在JS函數從JSEvaluateScript調用時。

通過在模擬器運行中查看調用堆棧我的意見是這個問題來自JavaScriptCore的JIT / LLINT嵌入式程序集。 我猜這些程序集缺少與調試機制相關的東西。 所以我擔心JavaScriptCode用戶端的程序員沒有解決方案。

可重復的源代碼

我在此存儲庫中打包了一個可重復的小例子。

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

腳步

  1. 克隆此存儲庫。
  2. 用Xcode打開。
  3. 打開test_main.c
  4. 把斷點printfTestNativeFuncJSEvaluateScriptTestMain
  5. 運行應用程序
  6. 它在printf停了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提交錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM