我试图用 C 编写一个函数来识别堆栈的顶部并确定第一个帧指针。然后我有一个不同的函数,它递归地打印当前堆栈帧并使用下一个堆栈帧的指针调用自身。关于如何做到这一点并开始的任何提示?
void stackTrace(int prms, int localVars){
}
void nextTrace(unsigned int *framePointer, int prms, int localVars){
}
我试图用 C 编写一个函数来识别堆栈的顶部并确定第一个帧指针。然后我有一个不同的函数,它递归地打印当前堆栈帧并使用下一个堆栈帧的指针调用自身。关于如何做到这一点并开始的任何提示?
void stackTrace(int prms, int localVars){
}
void nextTrace(unsigned int *framePointer, int prms, int localVars){
}
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;
}
我就是这样做的,因为 GNUbacktrace
不能与 TinyC 一起工作。我认为我的功能也适用于 gcc/clang。这里的技巧是从存储在 RBP(在 x86_64 上)中的地址开始,一直走到__libc_stack_end
它是一个内置变量。