สำหรับ 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); //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 }
ผลลัพธ์
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]