有关应用程序的信息:

  • Linux-2.4.1内核
  • 基于
  • 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();
    }
    

    最佳答案

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

  • 您正在调用fprintf()和其他多个异步信号安全的函数。考虑一下,fprintf在内部使用锁来同步多个线程对同一文件描述符的多个调用。如果您的分段错误在printf中间并且已被锁定怎么办?您会在分段处理程序的中间死锁...
  • 您正在分配内存(调用backtrace_symbols),但是如果分段错误是由于malloc竞技场损坏(很可能是分段违规的原因)引起的,则会在分段处理程序内部造成双重错误。
  • 如果多个线程同时导致异常,则代码将多次打开文件并运行日志。

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

    我的演讲中有一段视频,介绍如何编写适当的错误处理程序:http://free-electrons.com/pub/video/2008/ols/ols2008-gilad-ben-yossef-fault-handlers.ogg

    关于linux - SIGSEGV崩溃,但无法收集回溯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9222253/

    10-12 17:33