【发布时间】:2015-05-01 06:36:26
【问题描述】:
我已经在谷歌上搜索了很多次以在信号处理程序中找到 backtrace() 的正确解决方案,并尝试了几乎所有方法,但我无法在我的信号处理程序中成功获取回溯 - 这不是 SIGUSR1 处理程序。
- 在 uclibc 配置中启用 UCLIBC_HAS_BACKTRACE=y 并编译它
- 已验证 libubacktrace.so 已创建
- 使用以下选项编译我的应用程序二进制文件 -G -r动态 -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;
}
}
【问题讨论】:
-
您需要展示一些代码,尤其是您的信号处理程序代码。请编辑您的问题以改进它。
-
你在编写什么样的应用程序?你有一些事件循环吗?
-
那种......这个进程正在等待来自其他进程的“消息”。 SysV IPC 消息在多个进程之间建立,它们相互发布消息。除此之外,没有太多特殊操作……没有套接字 I/O。它通过调用 open() 和 write() 来更新字符设备,但只写入 1 个字节。
-
为什么不使用
AF_UNIX套接字?还是管道,还是 FIFO? -
没有防故障方法,因为您违反了异步信号安全要求。您可以尝试 Ian Taylor
libbacktrace,但您确实应该重新设计和重构您的应用程序以遵守signal(7)的要求。出于调试目的,使用gdb要简单得多!