【问题标题】:Stack trace function in CC中的堆栈跟踪函数
【发布时间】:2018-07-13 23:51:32
【问题描述】:

我试图用 C 语言编写一个函数来识别堆栈的顶部并确定第一个帧指针。然后我有一个不同的函数,它递归地打印当前堆栈帧并使用下一个堆栈帧的指针调用自身。有关如何执行此操作并开始使用的任何提示?

    void stackTrace(int prms, int localVars){

    }

    void nextTrace(unsigned int *framePointer, int prms, int localVars){

    }

【问题讨论】:

标签: c recursion stack-trace printstacktrace


【解决方案1】:
int backtrace(void **buffer, int size) {
    extern uint64_t *__libc_stack_end;
    uint64_t **p, *bp, *frame;
    asm ("mov %%rbp, %0;" : "=r" (bp));
    p = (uint64_t**) bp;
    int i = 0;
    while (i < size) {
        frame = p[0];
        if (frame < bp || frame > __libc_stack_end) {
            return i;
        }
        buffer[i++] = p[1];
        p = (uint64_t**) frame;
    }
    return i;
}

我就是这样做的,因为 GNU backtrace 不适用于 TinyC。我认为我的功能也适用于 gcc/clang。这里的技巧是从存储在 RBP 中的地址(在 x86_64 上)开始,一直走到 __libc_stack_end 这是一个内置变量。

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2011-09-10
    • 2017-04-01
    • 2011-01-03
    • 2017-08-06
    相关资源
    最近更新 更多