gpt4 book ai didi

c - C 中的堆栈跟踪函数

转载 作者:行者123 更新时间:2023-11-30 19:31:30 26 4
gpt4 key购买 nike

我正在尝试用 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;
}

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

关于c - C 中的堆栈跟踪函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48600291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com