有关申请的信息:
我们有一个应用程序,我们已经使用segmentation_handler函数实现了SIGSEGV的连接。在这个分段处理程序中,我们创建一个文件,进行文件写入(如“获得的堆栈帧”),然后使用回溯和符号将所有堆栈跟踪写入同一文件。
问题:我们得到一个SIGSEGV(由于创建了日志文件而确认)但遗憾的是该文件为空(0kb文件),但没有信息。 (即使第一个字符串是普通字符串在文件中也不可用)。
我想了解在什么情况下会发生这样的事情,因为我们可以解决崩溃,如果我们得到堆栈跟踪,但我们没有它,并且获得它的机制也不起作用:(
void segmentation_handler(int signal_no) {
char buffer[512]; .............
InitLog();//Create a log file
printf("\n*** segmentation fault occured ***\n");
fflush(stdout);
memset(buffer, 0, 512);
size = backtrace (array, 50);
strings = backtrace_symbols (array, size);
sprintf(buffer, "Obtained %d stack frames.\n", size);
Log(buffer);// Write the buffer into the file
for (n = 0; n < size; n++) {
sprintf(buffer, "%s\n", strings[n]); Log(buffer);
}
CloseLog();
}
答案 0 :(得分:4)
您的细分处理程序非常幼稚且包含多个错误。这是一个简短的清单:
您正在调用fprintf()和其他多个非异步信号安全的函数。考虑一下,fprintf在内部使用锁来同步多个线程中对同一文件描述符的多次调用。如果您的分段错误位于printf中间并且已经锁定,该怎么办?你会死在分段处理程序的中间......
您正在分配内存(调用backtrace_symbols),但如果分段错误是由于malloc竞技场损坏(非常可能导致分段违规),则会在分段处理程序中加倍故障。
< / LI>如果多个线程同时导致异常,则代码将多次打开文件并运行日志。
还有其他问题,但这些是基础......
我的演讲中有关于如何编写适当的故障处理程序的视频:http://free-electrons.com/pub/video/2008/ols/ols2008-gilad-ben-yossef-fault-handlers.ogg
答案 1 :(得分:3)
删除细分处理程序。
允许程序转储核心(ulimit -c unlimited或setrlimit in process)
查看您是否有核心文件。
使用工具链调试器
您还可以编写一个故意段错误的程序,并测试这两种方法(即使用核心文件或信号处理程序进行验证)。