如何在c/c+中处理SIGSEGV并在接收SIGSEGV时打印回跟踪+;节目? < >我构建了一个C++程序,其中需要处理SIGSEV,信号处理程序应该能够打印回描。 有人能帮上忙吗
关于获取SIGSEV回溯的最佳方法是生成核心文件,而不是打印回溯。小心,因为如果处理SIGSEV,系统将不会调用默认的堆芯生成器如何在c/c+中处理SIGSEGV并在接收SIGSEGV时打印回跟踪+;节目? < >我构建了一个C++程序,其中需要处理SIGSEV,信号处理程序应该能够打印回描。 有人能帮上忙吗,c++,C++,关于获取SIGSEV回溯的最佳方法是生成核心文件,而不是打印回溯。小心,因为如果处理SIGSEV,系统将不会调用默认的堆芯生成器 如果您仍然想处理SIGSEV(正如前面提到的,这是system deppendant),请参阅libc backtrace函数[],它可能很有用。除了Jon的回复之外,您基本上需要这样一个函数来打印backtrace。应在SIGSEGV上调用此函数。 但我同意Jon的观点,让系统生成corefile对您来说是一种更好的调试机制 void print_trace(int
如果您仍然想处理SIGSEV(正如前面提到的,这是system deppendant),请参阅libc backtrace函数[],它可能很有用。除了Jon的回复之外,您基本上需要这样一个函数来打印backtrace。应在SIGSEGV上调用此函数。 但我同意Jon的观点,让系统生成corefile对您来说是一种更好的调试机制
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);
}
void打印跟踪(int nSig)
{
printf(“print\u trace:got signal%d\n”,nSig);
void*数组[32];/*用于存储回溯符号的数组*/
size\u t size;/*以存储存储的值的确切数量*/
char**strings;/*用于将回溯列表中的函数存储在数组中*/
尺寸;
大小=回溯(数组,32);
字符串=回溯符号(数组、大小);
/*打印跟踪的每个函数名字符串*/
用于(nCnt=0;nCnt
在此处查看示例代码:
您可能需要对符号进行demangle处理,这就是代码示例所做的
然后再尝试两个选项:
- -fno省略帧指针
- -动力学
第一个选项将帧指针保留在生成的代码中,因此代码可以访问所有回溯帧。第二个将符号信息保存在链接的二进制文件中。这在我的arm9构建中起作用,不需要-g 到目前为止你制作了什么?实际上它是一个依赖于平台的东西。在安腾2 HP-UX上,您可以用一种方式进行操作,在Linux x64上可以用另一种方式进行操作。。。我使用了相同的技术,但它不是打印函数名。。可能的原因是什么。即使它不是为下面链接中给出的示例代码打印:请确保应用程序是使用-g选项编译的。这是生成符号所必需的。调用backtrace_符号不是一个好主意,因为它调用malloc()。在信号处理程序中调用异步信号不安全函数(如
backtrace()
,backtrace_symbols()
,printf
-family)是完全错误的。死锁可能会发生。正如我在回答中提到的,不建议这样做。我会编辑答案,不应该用于生产。但是这个函数在测试时帮了我很多。