Получение дампа процесса, который падает при запуске - PullRequest
4 голосов
/ 30 марта 2009

На клиентском компьютере (WinXP SP2), к которому у меня нет доступа, у меня есть Win32 EXE (неуправляемый C ++), который вылетает при запуске. Я думаю, что лучший способ устранить это - получить (мини) дамп и проанализировать его позже с помощью windbg или аналогичного.

Теперь я обычно говорю клиенту установить средства отладки для Windows и запустить

cscript adplus.vbs -crash

Однако, похоже, что вы не можете использовать adplus для приложений, которые аварийно завершают работу при запуске (http://support.microsoft.com/kb/q286350/ говорит, что «Не используйте ADPlus в следующих ситуациях: если вам нужно устранить неполадки программы или процесса, который неожиданно завершает работу» во время запуска "). В той же статье написано «использовать дамп процесса в режиме пользователя», но мне не удалось установить его успешно.

Есть идеи, как получить дамп процесса, который аварийно завершается при запуске на Win32?

Ответы [ 4 ]

13 голосов
/ 31 марта 2009

В качестве альтернативы вы можете настроить собственную структуру создания дампов, которая автоматически создает дамп процесса при обнаружении любого необработанного исключения. Это позволит клиентам не устанавливать Windbg.

Используйте SetUnhandledExceptionFilter Win32 API для регистрации обработчика исключений уровня приложения при запуске приложения. Зарегистрированная функция обратного вызова вызывается всякий раз, когда есть какое-либо исключение, которое не обрабатывается. Затем вы можете создать дамп процесса с помощью API 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; 
}

NB. - Зарегистрированный фильтр исключений не вызывается во время отладки процесса. Поэтому во время отладки, если вы ставите точку останова в функции фильтра исключений, не удивляйтесь, если она не срабатывает даже после возникновения необработанного исключения.

7 голосов
/ 30 марта 2009

Вы можете установить WinDBG на клиентском компьютере, а затем использовать « Параметры выполнения файла образа » и настроить WinDBG на открытие после запуска процесса. Затем запустите процесс сбоя, и WinDBG немедленно откроется. нажмите g (Go) и дождитесь завершения процесса, затем введите « .dump / mfh dumpFileName.dmp ». Теперь у вас есть файл дампа, который вы можете отлаживать.

2 голосов
/ 14 августа 2009

Вот хороший способ собрать сбои Vista SP1:

http://msdn.microsoft.com/en-us/library/bb787181(VS.85).aspx

Не нужно ничего устанавливать на машину!

0 голосов
/ 14 августа 2009

Установка инструментов разработчика на клиентском компьютере была бы моим последним средством, я должен признать, что ненавижу эту идею, особенно когда есть альтернативы, которые будут работать для вас.

Сначала подпишитесь на WinQual . Теперь вы получите доступ к аварийным дампам и другим ошибкам от ваших клиентов автоматически. Насколько я помню, это бесплатный сервис, нет причин не использовать его.

Поскольку WinQual, вероятно, потребуется некоторое время, чтобы аварийный дамп добрался до вас, и всегда приятно быть немного более отзывчивым к клиентам, особенно при сбоях приложений, используйте Dr. Уотсон . Насколько я помню, когда происходит сбой, перед нажатием на диалоговое окно вы можете запустить drwatsn32 из Пуск-> Выполнить или из командной строки, и появится доктор Уотсон. В этот момент закрытие диалогового окна сбоя приведет к созданию файла дампа сбоя. Если это не удастся, установите доктора Ватсона, запустив его с параметром -i в командной строке.

...