Avatar ·

كيفية الحصول تلقائيًا على مكدس الاستدعاءات (stacktrace) عند تعطل برنامج C++؟

مرحبًا بالجميع! أكتب بلغة C++ على Linux باستخدام مترجم GCC، وأواجه دائمًا مشاكل في تصحيح الأخطاء التي يصعب تتبعها. يتعطل البرنامج مع segmentation fault، لكنني لا أستطيع فهم أين يحدث ذلك بالضبط، لأن التعطل يحدث نادرًا وفي أماكن عشوائية. أستخدم بالفعل assert'ات، لكنها لا تساعد عندما يكون الخطأ مرتبطًا بتلف الذاكرة أو تجاوز سعة المخزن المؤقت. أريد أنه عند أي تعطل (SIGSEGV, SIGABRT, SIGFPE، إلخ) يقوم البرنامج تلقائيًا بطباعة مكدس الاستدعاءات الكامل مع أسماء الدوال والملفات وأرقام الأسطر. إليك مثال على الكود الخاص بي الذي يتعطل: ```cpp #include #include void dangerous_function(int* ptr) { *ptr = 42; // هنا قد يحدث segfault إذا كان ptr == nullptr } int main() { std::vector vec(10); int* bad_ptr = nullptr; dangerous_function(bad_ptr); // تعطل! return 0; } ``` سمعت عن backtrace() و backtrace_symbols()، لكنهما يعطيان فقط عناوين وليس أسماء قابلة للقراءة. كيف يمكن