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]