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