1

我想在 duktape 的致命处理程序中打印函数调用堆栈:

void duktape_fatal(void *d, const char *m)
{
    int line, pc, level;
    const char *fnName = NULL;

    printf("JSE fatal: %s!\n", (m ? m : ""));

    level = -1;

    while (1)
    {
            duk_inspect_callstack_entry(ctx, level);
            if (duk_is_undefined(ctx, -1))
            {
                    duk_pop(ctx);
                    break;
            }

            duk_get_prop_string(ctx, -1, "function");
            fnName = duk_to_string(ctx, -1);
            duk_pop(ctx);

            duk_get_prop_string(ctx, -1, "lineNumber");
            line = duk_to_int(ctx, -1);
            duk_pop(ctx);

            duk_get_prop_string(ctx, -3, "pc");
            pc = duk_to_int(ctx, -1);
            duk_pop(ctx);

            duk_pop(ctx);
            printf("Trace %i,%i: %s\n", pc, line, fnName);
            level--;
    }

    while (1)
    {
        ;
    }
}

这是一个触发致命错误的示例 JS 脚本:

function test3() {
    var b = 1;
    print(a);
}

function test2() {
        test3();
}

function test() {
        test2();
}

test();

在此示例中,致命函数将仅打印故障 lineNumber,但不打印调用堆栈。任何帮助表示赞赏。

4

0 回答 0