Стек вызова функции печати в фатальном обработчике дуктапа - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы напечатать стек вызовов функций в фатальном обработчике 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();

В этом примере фатальная функция выведет только номер строки ошибки, но не стек вызовов. Любая помощь приветствуется.

...