我已经多次使用谷歌在信号处理程序中找到 backtrace() 的正确解决方案并尝试了几乎所有方法,但我无法在我的信号处理程序中成功获取回溯 - 这不是 SIGUSR1 处理程序。
- 在 uclibc 配置中启用 UCLIBC_HAS_BACKTRACE=y 并编译它
- 验证 libubacktrace.so 已创建
- 使用以下选项编译我的应用程序二进制文件 -g -rdynamic -fexception 或 -funwind-tables
- 二进制文件本身似乎被“剥离”了
但是,我无法从信号处理程序中获得完整的回溯。仅打印了我在信号处理程序中调用的函数地址。
如果我使用 target-gdb 二进制文件并使用 gdb --pid 命令附加该进程,我能够正确获得完整的回溯。
另外,我尝试了 pstack,但是(pstack-1.2 - 尝试了 arm-patch 但它太可怕了......没有打印)不是很有帮助。
有什么建议吗?
1) Makefile 中的编译器选项
CFLAGS += -g -fexceptions -funwind-tables -Werror $(WARN) ...
2) 代码
代码非常简单。
#define CALLSTACK_SIZE 10
static void print_stack(void) {
int i, nptrs;
void *buf[CALLSTACK_SIZE + 1];
char **strings;
nptrs = backtrace(buf, CALLSTACK_SIZE);
printf("%s: backtrace() returned %d addresses\n", __func__, nptrs);
strings = backtrace_symbols(buf, nptrs);
if(strings == NULL) {
printf("%s: no backtrace captured\n", __func__);
return;
}
for(i = 0; i < nptrs; i++) {
printf("%s\n", strings[i]);
}
free(strings);
}
...
static void sigHandler(int signum)
{
printf("%s: signal %d\n", __FUNCTION__, signum);
switch(signum ) {
case SIGUSR2:
// told to quit
print_stack();
break;
default:
break;
}
}