C语言中的堆栈跟踪函数

C语言中的堆栈跟踪函数,c,recursion,stack-trace,printstacktrace,C,Recursion,Stack Trace,Printstacktrace,我正在尝试用C语言编写一个函数,用于标识堆栈顶部并确定第一个帧指针。然后我有一个不同的函数,它递归地打印当前堆栈帧,并使用下一个堆栈帧的指针调用自己。关于如何做到这一点并开始工作,有什么建议吗 void stackTrace(int prms, int localVars){ } void nextTrace(unsigned int *framePointer, int prms, int localVars){ } int回溯(无效**缓冲区,int大

我正在尝试用C语言编写一个函数,用于标识堆栈顶部并确定第一个帧指针。然后我有一个不同的函数,它递归地打印当前堆栈帧,并使用下一个堆栈帧的指针调用自己。关于如何做到这一点并开始工作,有什么建议吗

    void stackTrace(int prms, int localVars){

    }

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

    }
int回溯(无效**缓冲区,int大小){
外部uint64_t*_libc_stack_end;
uint64\u t**p,*bp,*帧;
asm(“mov%%rbp,%0;”:“=r”(bp));
p=(uint64_t**)bp;
int i=0;
而(iuuu libc_ustack_uend){
返回i;
}
缓冲区[i++]=p[1];
p=(uint64_t**)帧;
}
返回i;
}
我就是这样做的,因为GNU
backtrace
不适用于TinyC。我想我的功能也很好用。这里的技巧是从存储在RBP(x86_64上)中的地址开始,一直走到
\uu libc\u stack\u end
,这是一个内置变量

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;
}