Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में GCC द्वारा ऑटोमैटिक स्टैक ट्रेस जनरेट करना


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 जैसी लाइब्रेरीज अधिक रॉबस्ट होती हैं।

  1. C++ प्रोग्राम का उपयोग करके प्रोग्राम कैसे लॉन्च करें? C++ प्रोग्राम का उपयोग करके प्रोग्राम कैसे लॉन्च करें?

    सिस्टम कमांड का उपयोग करके एप्लिकेशन लॉन्च करना यहां हम देखेंगे कि C++ प्रोग्राम का उपयोग करके नोटपैड जैसे किसी थर्ड-पार्टी एप्लिकेशन को कैसे शुरू किया जाए। यह प्रोग्राम बहुत सरल है; हम कमांड प्रॉम्प्ट कमांड का उपयोग करके यह कार्य कर सकते हैं। हम system() फ़ंक्शन के अंदर एप्लिकेशन नाम पास करेंगे। य

  1. - C++ में Hello World प्रोग्राम कैसे लिखें?

    Hello World प्रोग्राम चलाने के लिए, आपको निम्नलिखित चरणों का पालन करना होगा: C++ प्रोग्राम लिखें अब जब आपके पास एक कंपाइलर इंस्टॉल है, तो C++ प्रोग्राम लिखने का समय आ गया है। आइए प्रोग्रामिंग उदाहरण के प्रतीक, Hello World प्रोग्राम से शुरू करते हैं। हम इस उदाहरण में C++ का उपयोग करके स्क्रीन पर Hel

  1. - C++ में एक साधारण प्रोग्राम कैसे बनाएं?

    C++ में एक बहुत ही साधारण प्रोग्राम प्राप्त करने के लिए, आपको पहले इसे सेट अप करना होगा और फिर इसके लिए प्रोग्राम बनाना होगा। निम्नलिखित चरण C++ में एक बहुत ही साधारण प्रोग्राम का उपयोग करके शुरुआत करने का तरीका सूचीबद्ध करते हैं। C++ कंपाइलर प्राप्त करें यह पहला कदम है जो आप C++ में प्रोग्राम करना