在处理应用程序中的信号时,我可以在调试器中正确看到backtrace。但是backtrace系统调用未正确显示堆栈帧.gdb存储堆栈帧的方式和backtrace系统调用如何转储它们之间有区别吗?
我有以下 C/C++ 代码,它使用__builtin_return_address:
#include <stdio.h>
#ifdef __clang__
# define optnone __attribute__((optnone))
#else
# define optnone __attribute__((optimize("O0")))
#endif
void *f() {
return __builtin_extract_return_addr(__builtin_return_address(2));
}
optnone void nest1() {
printf("%p\n", f());
}
optnone void nest2() {
nest1();
}
optnone void nest3() {
nest2();
}
optnone void nest4() {
nest3();
}
optnone int main() {
nest4();
}
Run Code Online (Sandbox Code Playgroud)
GCC生成以下程序集并且工作正常(不会崩溃):
f:
push rbp
mov rbp, rsp
mov rax, QWORD PTR [rbp+0]
pop rbp
mov rax, QWORD PTR [rax]
mov rax, QWORD …Run Code Online (Sandbox Code Playgroud)