Linux में GCC से कंपाइल किए गए C++ प्रोग्राम के क्रैश होने पर ऑटोमैटिक स्टैक ट्रेस प्राप्त करने के लिए backtrace() फंक्शन (<execinfo.h>) और सिग्नल हैंडलर का उपयोग करें।
उदाहरण कोड
#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 << "\n=== CRASH DETECTED ===\n";
cerr << "Signal: " << sig << " (" << strsignal(sig) << ")\n";
cerr << "Stack trace (" << size << " frames):\n";
// सिम्बल्स के साथ प्रिंट करें
backtrace_symbols_fd(array, size, STDERR_FILENO);
cerr << "========================\n";
exit(1);
}
// सिग्नल हैंडलर रजिस्टर करें
struct CrashHandler {
CrashHandler() {
signal(SIGSEGV, signalHandler); // सेगमेंटेशन फॉल्ट
signal(SIGABRT, signalHandler); // अबॉर्ट
signal(SIGFPE, signalHandler); // फ्लोटिंग पॉइंट एक्सेप्शन
signal(SIGILL, signalHandler); // इलीगल इंस्ट्रक्शन
}
} crashHandler;
void func3() {
int *ptr = nullptr;
*ptr = 42; // SIGSEGV ट्रिगर करेगा
}
void func2() { func3(); }
void func1() { func2(); }
int main() {
cout << "Program starting... will crash in 2 seconds\n";
sleep(2);
func1(); // क्रैश यहां से शुरू होता है
return 0; // कभी नहीं पहुंचेगा
}
आउटपुट
=== CRASH DETECTED === Signal: 11 (Segmentation fault) Stack trace (5 frames): ./a.out(+0x1234)[0x55a1b2c3d234] ./a.out(+0x1245)[0x55a1b2c3d245] ./a.out(+0x1256)[0x55a1b2c3d256] ./a.out(+0x1267)[0x55a1b2c3d267] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f8a9b0c1b97] ========================
एड्रेस को फंक्शन नाम में बदलना
रॉ एड्रेस को पढ़ने योग्य फंक्शन नाम में बदलने के लिए:
# बैश में addr2line -e ./a.out 0x55a1b2c3d234 0x55a1b2c3d245 ... # या C++ कोड में (GNU एक्सटेंशन) #include <cxxabi.h> // backtrace_symbols() के बजाय backtrace_symbols_fd() के आउटपुट पार्स करें
कंपाइलेशन फ्लैग्स (आवश्यक!)
# डीबग सिम्बल्स के साथ कंपाइल करें g++ -g -rdynamic -std=c++17 crash_demo.cpp -o crash_demo # -rdynamic: सिम्बल्स को डायनामिक सिम्बल टेबल में एक्सपोर्ट करता है # -g: डीबग इन्फो शामिल करता है
उन्नत: C++ एक्सेप्शन के साथ स्टैक ट्रेस
#include <exception>
#include <execinfo.h>
class TracedException : public exception {
vector<string> stackTrace;
public:
TracedException() {
void *array[50];
size_t size = backtrace(array, 50);
char **symbols = backtrace_symbols(array, size);
for (size_t i = 0; i < size; i++)
stackTrace.push_back(symbols[i]);
free(symbols);
}
const char* what() const noexcept override {
return "Exception with stack trace";
}
void printStackTrace() const {
for (const auto& frame : stackTrace)
cerr << frame << '\n';
}
};
void riskyFunction() {
throw TracedException();
}
int main() {
try {
riskyFunction();
} catch (const TracedException& e) {
e.printStackTrace();
}
}
नोट: प्रोडक्शन में libbacktrace, boost::stacktrace, या abseil/stacktrace जैसी लाइब्रेरीज अधिक रॉबस्ट होती हैं।