Computer >> Máy Tính >  >> Lập trình >> C ++

Làm cách nào để tự động tạo stacktrace khi chương trình gcc C ++ gặp sự cố?

Đối với Linux và chúng ta có thể sử dụng gcc để biên dịch mã C / C ++. Trình biên dịch này sử dụng thư viện glibc. Chúng ta có thể sử dụng hàm backtrace () để theo dõi lỗi. Hàm này hiện diện bên trong tệp tiêu đề executeinfo.h. Trong ví dụ này, chúng tôi sẽ hiển thị lỗi lỗi Phân đoạn bằng cách sử dụng tính năng theo dõi ngăn xếp.

Ví dụ

#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); //get the void pointers for all of the entries
   cout << "Error: signal "<< sig <<":\n"; //display error signal
   backtrace_symbols_fd(array, size, STDERR_FILENO);
   exit(1);
}
void invalid_index() {
   int *ptr = (int*) - 1;
   cout << *ptr << endl; // segmentation error
}
void func1() {
   invalid_index();
}
void func2() {
   func1();
}
int main(int argc, char **argv) {
   signal(SIGSEGV, error_handler); // use handler to print the errors
   func2(); // this will call all other function to generate error
}

Đầu ra

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]