Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c/c+中处理SIGSEGV并在接收SIGSEGV时打印回跟踪+;节目? < >我构建了一个C++程序,其中需要处理SIGSEV,信号处理程序应该能够打印回描。 有人能帮上忙吗_C++ - Fatal编程技术网

如何在c/c+中处理SIGSEGV并在接收SIGSEGV时打印回跟踪+;节目? < >我构建了一个C++程序,其中需要处理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回溯的最佳方法是生成核心文件,而不是打印回溯。小心,因为如果处理SIGSEV,系统将不会调用默认的堆芯生成器


如果您仍然想处理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)是完全错误的。死锁可能会发生。正如我在回答中提到的,不建议这样做。我会编辑答案,不应该用于生产。但是这个函数在测试时帮了我很多。