Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tự động tạo stack trace khi chương trình C++ crash (gcc/Linux)


Sử dụng backtrace() từ <execinfo.h> kết hợp xử lý signal SIGSEGV để in stack trace khi chương trình bị segmentation fault.

Ví dụ mã nguồn

#include <iostream>
#include <execinfo.h>
#include <signal.h>
#include <cstdlib>
#include <unistd.h>
using namespace std;

void signalHandler(int sig) {
    void* array[50];
    size_t size = backtrace(array, 50);
    cerr << "Loi signal " << sig << " (Segfault):\n";
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}

void crashFunc() {
    int* p = (int*)-1; // địa chỉ không hợp lệ
    cout << *p;        // gây segfault
}

void funcA() { crashFunc(); }
void funcB() { funcA(); }

int main() {
    signal(SIGSEGV, signalHandler);
    funcB(); // chuỗi gọi: main -> funcB -> funcA -> crashFunc
    return 0;
}

Đầu ra mẫu

Loi signal 11 (Segfault):
./a.out(+0x1234)[0x55...]
/lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7f...]
./a.out(+0x1280)[0x55...]
./a.out(+0x12a1)[0x55...]
./a.out(+0x12ad)[0x55...]
./a.out(+0x12d5)[0x55...]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f...]
./a.out(+0x111a)[0x55...]

Biên dịch

g++ -g -rdynamic -o demo demo.cpp
# -g: thông tin debug
# -rdynamic: xuất symbol ra dynamic symbol table