如何在c / C ++程序中处理SIGSEGV并在接收SIGSEGV时打印回跟踪?

时间:2010-05-14 08:20:39

标签: c++

我构建了一个C ++程序,我需要处理SIGSEGV,而Signal处理程序应该能够打印Back Trace。 任何人都可以为此提供帮助。

问候

3 个答案:

答案 0 :(得分:5)

获得SIGSEV回溯的最佳方法是生成核心文件而不是打印回溯。请注意,如果您处理SIGSEV,系统将不会调用默认的核心生成器。

如果你想要处理SIGSEV(正如在系统权限之前已经注释过),请参阅libc回溯函数[http://www.gnu.org/s/libc/manual/html_node/Backtraces.html],它可能很有用。

答案 1 :(得分:2)

添加到Jon回复的内容,你基本上需要这样的函数来打印回溯。这个功能应该在SIGSEGV上调用。 但我第二点Jon的观点是让系统生成核心文件对你来说是一个更好的调试机制

void print_trace(int nSig)
{
  printf("print_trace: got signal %d\n", nSig);

  void           *array[32];    /* Array to store backtrace symbols */
  size_t          size;     /* To store the exact no of values stored */
  char          **strings;    /* To store functions from the backtrace list in ARRAY */
  size_t          nCnt;

  size = backtrace(array, 32);

  strings = backtrace_symbols(array, size);

  /* prints each string of function names of trace*/
  for (nCnt = 0; nCnt < size; nCnt++)
    fprintf(stderr, "%s\n", strings[nCnt]);


  exit(-1);
}

答案 2 :(得分:1)

在这里查看示例代码:

  

C++ Code Snippet - Print Stack Backtrace Programmatically with Demangled Function Names

您可能需要对符号进行解码,这就是代码示例的作用。

再尝试两个选项:

  • -fno-omit-frame-pointer
  • -rdynamic

第一个选项将帧指针保存在生成​​的代码中,因此代码可以访问所有的回溯帧。第二个将符号信息保存在链接二进制文件中。这适用于我的arm9构建,并且不需要-g。