الحصول على تفريغ العملية التي تعطل عند بدء التشغيل

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

سؤال

على جهاز العميل (WinXP SP2) الذي لا يمكنني الوصول إليه، لدي Win32 EXE (C++ غير مُدار) الذي يتعطل عند بدء التشغيل.أعتقد أن أفضل طريقة لاستكشاف هذه المشكلة وإصلاحها هي الحصول على ملف تفريغ (مصغر) وتحليله لاحقًا باستخدام Windbg أو ما شابه.

الآن، عادةً ما أطلب من العميل تثبيت Debugging Tools لنظام التشغيل Windows وتشغيله

cscript adplus.vbs -crash

ومع ذلك، يبدو أنه لا يمكنك استخدام adplus للتطبيقات التي تتعطل عند بدء التشغيل (http://support.microsoft.com/kb/q286350/ يقول "لا تستخدم ADPlus في الحالات التالية:إذا كان يجب عليك استكشاف أخطاء برنامج أو عملية يتم إنهاؤها بشكل غير متوقع أثناء بدء التشغيل").تقول نفس المقالة "استخدم تفريغ عملية وضع المستخدم"، لكنني فشلت في تثبيته بنجاح.

هل لديك أي فكرة عن كيفية الحصول على تفريغ العملية التي تتعطل عند بدء التشغيل على Win32؟

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

المحلول

يمكنك التثبيت WinDBG على جهاز العميل ثم استخدم "خيارات تنفيذ ملف الصورة" وقم بتعيين WinDBG ليتم فتحه بمجرد بدء العملية.ثم قم بتشغيل عملية التعطل وسيتم فتح WinDBG على الفور.يضعط ز (اذهب) وانتظر حتى تتعطل العملية ثم اكتب ".dump /mfh dumpFileName.dmp".الآن لديك ملف تفريغ يمكنك تصحيحه.

نصائح أخرى

وبدلا من ذلك يمكنك إنشاء الخاصة الإطار الجيل تفريغ بك مما يخلق تفريغ عملية تلقائيا عند مواجهة أي استثناء غير معالج. وهذا من شأنه تجنب عملاء الحاجة إلى تثبيت Windbg.

استخدم SetUnhandledExceptionFilter Win32 وAPI لتسجيل معالج استثناء مستوى التطبيق في تطبيق بدء التشغيل. يتم استدعاء الدالة رد الاتصال المسجلة كلما كان هناك أي استثناء التي لم يتم التعامل معها. قد U ثم إنشاء تفريغ العملية باستخدام MiniDumpWriteDump المعهد من DbgHelp.dll.

ورمز نموذج: -

LONG WINAPI My_UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    HANDLE hFile = CreateFile("FileName",
            GENERIC_WRITE,
            0,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    MINIDUMP_EXCEPTION_INFORMATION aMiniDumpInfo;
    aMiniDumpInfo.ThreadId = GetCurrentThreadId();
    aMiniDumpInfo.ExceptionPointers = ExceptionInfo;
    aMiniDumpInfo.ClientPointers = TRUE;

    MiniDumpWriteDump(GetCurrentProcess(),
            GetCurrentProcessId(),
            hFile,
            (MINIDUMP_TYPE) (MiniDumpWithFullMemory|MiniDumpWithHandleData),
            &aMiniDumpInfo,
            NULL,
            NULL);

    CloseHandle(hFile);

    return EXCEPTION_EXECUTE_HANDLER;
}


int main(int argc, char* argv[])
{
    SetUnhandledExceptionFilter(&My_UnhandledExceptionFilter);

    // User code throwing exception..

    return 0; 
}

ملحوظة: - لم يتم استدعاء تصفية استثناء المسجلة عندما يتم تصحيحه العملية. حتى أثناء تصحيح الأخطاء إذا وضعت نقطة توقف في وظيفة تصفية الاستثناء لا أميل تفاجأ إذا لم تصل حتى بعد تسبب استثناء غير معالج.

وهنا هو وسيلة لطيفة لجمع فيستا SP1 تعطل:

http://msdn.microsoft.com/ أون لنا / مكتبة / bb787181 (VS.85) .aspx اتصال

لا حاجة لتركيب أي شيء على الجهاز!

سيكون تثبيت أدوات المطورين على جهاز العميل هو الملاذ الأخير بالنسبة لي، ويجب أن أعترف بأنني أكره الفكرة خاصة عندما تكون هناك بدائل تناسبك.

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

نظرًا لأن WinQual من المحتمل أن يستغرق بعض الوقت حتى يصل ملف تفريغ الأعطال إليك، ومن الجيد دائمًا أن تكون أكثر استجابة للعملاء خاصة عند تعطل التطبيق، استخدم دكتور.واتسون.على ما أذكر عندما يحدث العطل، قبل النقر على مربع الحوار يمكنك تشغيله drwatsn32 من ابدأ->تشغيل أو سطر الأوامر وسيظهر برنامج Dr Watson.عند هذه النقطة، سيؤدي تجاهل مربع حوار التعطل إلى إنشاء ملف تفريغ التعطل.في حالة فشل ذلك، قم بتثبيت Dr Watson عن طريق تشغيله باستخدام الملف -أنا المعلمة في سطر الأوامر

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