كيف يمكن لبرنامج C أن ينتج تفريغًا أساسيًا لنفسه دون إنهائه؟

StackOverflow https://stackoverflow.com/questions/131439

  •  02-07-2019
  •  | 
  •  

سؤال

أريد أن يقوم برنامج C بإنتاج تفريغ أساسي في ظل ظروف معينة.هذا برنامج يتم تشغيله في بيئة إنتاج ولا يمكن إيقافه وإعادة تشغيله بسهولة لضبط أنواع أخرى من أكواد تصحيح الأخطاء.أيضًا، نظرًا لوجوده في بيئة إنتاج، لا أريد استدعاء abort() .لا يمكن تكرار المشكلات قيد التحقيق بسهولة في بيئة غير إنتاجية.ما أريده هو أن يقوم البرنامج، عندما يكتشف مشكلات معينة، بإنتاج ملف تفريغ أساسي من تلقاء نفسه، ويفضل أن يكون ذلك مع معلومات كافية لإعادة تسمية الملف، ثم المتابعة.

هل كانت مفيدة؟

المحلول

void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        abort() || (*((void*)0) = 42);
    }
}

قم بتفرع العملية ثم قم بتعطيل الطفل - سيعطيك لقطة وقتما تشاء

نصائح أخرى

هناك طريقة أخرى قد تكون استخدام جوجل كوردومبر مكتبة.يؤدي هذا إلى إنشاء نتيجة مشابهة لتقنية fork+abort ولكنه يعمل بشكل أفضل مع التطبيقات ذات مؤشرات الترابط المتعددة (يعلق جميع سلاسل الرسائل لفترة قصيرة قبل التفرع حتى لا يحدث فوضى في الطفل).

مثال:

    #include <google/coredumper.h>
    ...
    WriteCoreDump('core.myprogram');
    /* Keep going, we generated a core file,
     * but we didn't crash.
     */

يصف Sun كيفية الحصول على ملف أساسي على Solaris وHP-UX وRedhat وWindows هنا.

سولاريس لديه برنامج gcore.قد يكون لدى HP-UX ذلك.بخلاف ذلك، استخدم gdb وأوامر gcore الخاصة به.يحتوي Windows على win-dbg-root list.exe وwin-dbg-root\adplus.vbs

هل تريد حقًا جوهرًا أم مجرد تتبع مكدس؟إذا كان كل ما تريده هو تتبع المكدس، فيمكنك إلقاء نظرة على المصدر المفتوح هنا وحاول دمج الكود من هناك، أو ربما يكفي مجرد استدعائه من سطر الأوامر.

أعتقد أن بعض التعليمات البرمجية في مشروع gdb قد تكون مفيدة أيضًا.

هناك فكرة أخرى قد ترغب في القيام بها وهي استخدام gdb للإرفاق بعملية قيد التشغيل.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process

الكود المصدري لإنتاج تفريغ أساسي موجود في "gcore"، وهو جزء من حزمة gdb.

وكذلك الشمس لديها com.gcore.

وأيضًا، يجب أن يكون لديك عملية منفصلة تقوم بتشغيل التفريغ الأساسي، حيث يجب تعليق العملية الحالية.ستجد التفاصيل في مصدر gcore، أو يمكنك فقط تشغيل gcore الخاص بالنظام الأساسي الخاص بك مع عمليتك كهدف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top