[英]JavascriptCore: executing a javascript-defined callback function from native code
[英]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調試器會掛起。
我不需要使用Objective-C API,因為我想與iOS和Android共享代碼。
從我的實驗中,我得到了這些條件。
JSObjectCallAsFunction
調用時,它不會發生。 JSEvaluateScript
調用時。 通過在模擬器運行中查看調用堆棧我的意見是這個問題來自JavaScriptCore的JIT / LLINT嵌入式程序集。 我猜這些程序集缺少與調試機制相關的東西。 所以我擔心JavaScriptCode用戶端的程序員沒有解決方案。
我在此存儲庫中打包了一個可重復的小例子。
https://github.com/omochi/jscore-debugger-hangup
test_main.c
。 printf
在TestNativeFunc
和JSEvaluateScript
在TestMain
。 printf
停了printf
。 JSEvaluateScript
。 如果刪除兩個斷點,它將正確運行並打印兩個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.