【问题标题】:Non-documented API & headers未记录的 API 和标头
【发布时间】:2013-05-18 03:11:56
【问题描述】:

我在我的一个 Objective-C 项目中使用 JavaScriptCore,我想随时知道当陷入 JS 回调时,当前文件和行是什么。

public headers 没有办法做到这一点,所以我看了一下sources,似乎可以使用一些 C++ 代码访问文件和行。

// ctx is a JSContextRef, that's the only type I have an access to
JSC::JSValue jsCtx = toJS(ctx);
CodeBlock* codeBlock = jsCtx->codeBlock();

// Line
unsigned sourceOffset = codeBlock->sourceOffset();

// Source URL
SourceProvider* sourceProvider = codeBlock->source();
const String& url = sourceProvider->url();

显然需要JSCJSValueCodeBlockSourceProvider的定义。我将所有这些都放在单独的标题中,但它确实很大。

  • 我应该直接包含这些标题吗?
  • 如果这些文件需要其他头文件怎么办?最后可能会有多个我不会使用的标题。
  • 让我们忘记内部源代码可能会发生变化:我想要做的甚至可能吗?

【问题讨论】:

    标签: c++ objective-c header webkit javascriptcore


    【解决方案1】:

    您可以从公共标头本身了解此信息。给你:

    当异常发生时,异常对象包含以下键:

    行、sourceId、sourceURL、名称、消息

    您可以访问这些键的值以查找发生异常的文件 (sourceURL) 和行号 (line)。

    例子:

    JSObjectRef exceptionObj = JSValueToObject(context, exception, NULL);
    
    //Convert the exceptionObj into dictionary (I leave the implementation of this to you..)
    NSDictionary *exceptionDict = [self convertJSObjectToDictionary:exceptionObj];
    
    NSString *lineNumber = [exceptionDict objectForKey:@"line"];
    NSString *fileName = [exceptionDict objectForKey:@"sourceURL"];
    
    NSLog(@"Exception has occurred in file:%@ at line number:%@", fileName, lineNumber);
    

    希望这会有所帮助!

    ~苏尼尔·帕尼·曼内

    【讨论】:

    • 感谢 Sunil,但我想随时获取堆栈跟踪,而不仅仅是在异常之后。所以当一个原生 C 函数被绑定到 JS 上下文并且这个函数被调用时,我想知道什么时候调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多