我构建了一个C ++程序,我需要处理SIGSEGV,而Signal处理程序应该能够打印Back Trace。 任何人都可以为此提供帮助。
问候
答案 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
您可能需要对符号进行解码,这就是代码示例的作用。
再尝试两个选项:
第一个选项将帧指针保存在生成的代码中,因此代码可以访问所有的回溯帧。第二个将符号信息保存在链接二进制文件中。这适用于我的arm9构建,并且不需要-g。