Получение дампа процесса, который аварийно завершает работу при запуске

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

Вопрос

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

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

cscript adplus.vbs -crash

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

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

Это было полезно?

Решение

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

Другие советы

В качестве альтернативы вы можете настроить собственную структуру создания дампа, которая автоматически создает дамп процесса при обнаружении любого необработанного исключения.Это избавит клиентов от необходимости устанавливать 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: - Зарегистрированный фильтр исключений не вызывается во время отладки процесса.Поэтому во время отладки, если вы поместите точку останова в функцию фильтра исключений, не удивляйтесь, если она не сработает даже после возникновения необработанного исключения.

Вот хороший способ собрать данные о сбоях Vista SP1:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top