我已经多次使用谷歌搜索来寻找在信号处理程序中使用backtrace()的正确解决方案,并尝试了几乎所有方法,但是我无法在我的信号处理程序中成功获取backtrace——这不是SIGUSR1处理程序。
- 在uclibc配置中启用UCLIBC_HAS_BACKTRACE=y并编译它
- 验证是否创建了libubacktrace.so
- 使用以下选项编译我的应用程序二进制文件 -g -rdynamic -fexception或-funwind-tables
- 二进制文件本身似乎被“剥离”了
然而,我无法从信号处理程序中获取完整的backtrace。 只打印了我在信号处理程序中调用的函数地址。
如果我使用target-gdb二进制文件并使用gdb --pid命令附加进程,则能够正确地获取完整的backtrace。
此外,我尝试了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;
}
}
AF_UNIX
套接字?或者管道,或者FIFO? - Basile Starynkevitchlibbacktrace
,但您真的应该重新设计和重构您的应用程序以遵守signal(7)
要求。为了调试目的,使用gdb
要简单得多! - Basile Starynkevitch