当 gcc C++ 程序崩溃时如何自动生成堆栈跟踪?

c++server side programmingprogramming

对于 Linux,我们可以使用 gcc 编译 C/C++ 代码。此编译器使用 glibc 库。我们可以使用 backtrace() 函数来跟踪错误。此函数位于 execinfo.h 头文件中。在此示例中,我们将使用堆栈跟踪功能显示分段错误。

示例

#include <iostream>
#include <execinfo.h>
#include <signal.h>
#include <cstdlib>
#include <unistd.h>
using namespace std;
void error_handler(int sig) {
   void *array[10];
   size_t size;
   size = backtrace(array, 10); //获取所有条目的 void 指针
   cout << "Error: signal "<< sig <<":\n"; //显示错误信号
   backtrace_symbols_fd(array, size, STDERR_FILENO);
   exit(1);
}
void invalid_index() {
   int *ptr = (int*) - 1;
   cout << *ptr << endl; // 分段错误
}
void func1() {
   invalid_index();
}
void func2() {
   func1();
}
int main(int argc, char **argv) {
   signal(SIGSEGV, error_handler); // 使用处理程序打印错误
   func2(); // 这将调用所有其他函数来生成错误
}

输出

Error: signal 11:
./a.out(+0x825)[0x5579a31d7825]
/lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7f7689009f20]
./a.out(+0x880)[0x5579a31d7880]
./a.out(+0x8a1)[0x5579a31d78a1]
./a.out(+0x8ad)[0x5579a31d78ad]
./a.out(+0x8d5)[0x5579a31d78d5]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f7688fecb97]
./a.out(+0x71a)[0x5579a31d771a]

相关文章