SIGSEGV崩溃,但无法收集回溯

时间:2012-02-10 03:20:41

标签: linux embedded-linux

有关申请的信息:

  • Linux - 2.4.1 Kernel
  • 基于m68k的嵌入式应用程序
  • 单进程多线程应用程序

我们有一个应用程序,我们已经使用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();
}

2 个答案:

答案 0 :(得分:4)

您的细分处理程序非常幼稚且包含多个错误。这是一个简短的清单:

  1. 您正在调用fprintf()和其他多个非异步信号安全的函数。考虑一下,fprintf在内部使用锁来同步多个线程中对同一文件描述符的多次调用。如果您的分段错误位于printf中间并且已经锁定,该怎么办?你会死在分段处理程序的中间......

  2. 您正在分配内存(调用backtrace_symbols),但如果分段错误是由于malloc竞技场损坏(非常可能导致分段违规),则会在分段处理程序中加倍故障。

    < / LI>
  3. 如果多个线程同时导致异常,则代码将多次打开文件并运行日志。

  4. 还有其他问题,但这些是基础......

    我的演讲中有关于如何编写适当的故障处理程序的视频:http://free-electrons.com/pub/video/2008/ols/ols2008-gilad-ben-yossef-fault-handlers.ogg

答案 1 :(得分:3)

  • 删除细分处理程序。

  • 允许程序转储核心(ulimit -c unlimited或setrlimit in process)

  • 查看您是否有核心文件。

  • 使用工具链调试器

  • 离线执行回溯项目

您还可以编写一个故意段错误的程序,并测试这两种方法(即使用核心文件或信号处理程序进行验证)。