Исключения при использовании MiniDumpWriteDump() Win32 API при отладке

Я породил процесс "2" из процесса "1" в C++/CLI. Пока оба работают, процесс "1" убивает процесс "2" (по замыслу). Моя цель - сделать мини-дамп "2" как раз перед тем, как его убить.

Вот мой код:

// mpProcess started with System::Diagnostics::Process... etc.
System::IO::FileStream^ fs = gcnew System::IO::FileStream("MyPath.dmp");

MiniDumpWriteDump( mpProcess->Handle.ToPointer(), mpProcess->Id, fs->SafeFileHandle->DangerousGetHandle().ToPointer(), MINIDUMP_TYPE::MiniDumpNormal, nullptr, nullptr, nullptr);
fs->Close();

Когда я запускаю процесс "1" из командной строки, не подключая его к отладчику, он работает нормально, запускает процесс "2", затем выводит его, а затем убивает.

Когда я запускаю процесс "1" в отладчике, я получаю 2-3 AccessViolationException, когда перехожу к вызову MiniDumpWriteDump, но если я нажимаю "Продолжить", все идет хорошо, и создается файл дампа.

Что здесь происходит? Что-то не так в моем дизайне? Обратите внимание, что я впервые использую этот API, я даже не знал, что смогу создать дамп такого файла 24 часа назад;-)! Я буду благодарен за вашу любезную помощь, чтобы улучшить мои навыки с файлами дампа.

РЕДАКТИРОВАТЬ 1 Добавлено Исключение информации:

Вот сообщение, которое я получил:

Возникло исключение 0x000007FED860FD31 (mscordacwks.dll) в MYProg.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000000000000000.

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

РЕДАКТИРОВАТЬ 2 Добавлен фрагмент и трассировка стека

Процесс 1: "убийца"

// Process1.cpp : main project file.

#include "stdafx.h"

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <dbghelp.h>

using namespace System;

int main(array<System::String ^> ^args)
{
     Console::WriteLine(L"Hello, I'm Process1! I'll \"minidump\" Process2 then kill it!");

    System::Diagnostics::Process^ p = gcnew System::Diagnostics::Process();

    p->StartInfo->FileName = "Process2.exe";
    p->Start();

    System::Threading::Thread::Sleep( 3000 );

    System::IO::FileStream^ fs = gcnew System::IO::FileStream( "minidump.dmp", System::IO::FileMode::Create );

    MiniDumpWriteDump( p->Handle.ToPointer(), p->Id, fs->SafeFileHandle->DangerousGetHandle().ToPointer(), MINIDUMP_TYPE::MiniDumpNormal, nullptr, nullptr, nullptr );

    fs->Close();

    p->Kill();

    return 0;
}

Процесс 2: "сбрасывается"

// Process2.cpp : main project file.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello, I'm Process2! I'm waiting to be killed by Process1!");

    // Do nothing, wait to be killed
    while ( true )
    {
        System::Threading::Thread::Sleep( 1000 );
    }

    return 0;
}

Трассировка стека, когда я ломаю его в диалоге исключения (AccessViolation):

mscordacwks.dll!000007fed860fd31()  Unknown
mscordacwks.dll!000007fed861028c()  Unknown
mscordacwks.dll!000007fed8610fd2()  Unknown
mscordacwks.dll!000007fed861165f()  Unknown
mscordacwks.dll!000007fed861176e()  Unknown
dbghelp.dll!GenGetAuxMemory(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS *)    Unknown
dbghelp.dll!GenGetProcessInfo(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS * *)    Unknown
dbghelp.dll!MiniDumpProvideDump()   Unknown
dbghelp.dll!MiniDumpWriteDump() Unknown
[Managed to Native Transition]  
[CURSOR]>>> Process1.exe!main(array<System::String^>^ args=array<System::String^>(0)) Line 24   C++
Process1.exe!mainCRTStartupStrArray(array<System::String^>^ arguments=array<System::String^>(0)) Line 249   C++
[Native to Managed Transition]  
mscoreei.dll!000007feee467a6d() Unknown
mscoree.dll!_CorExeMain_Exported()  Unknown
kernel32.dll!BaseThreadInitThunk()  Unknown
ntdll.dll!RtlUserThreadStart()  Unknown

1 ответ

Как и Ханс Пассан, упомянутый в комментариях выше, это похоже на внутреннее / пойманное исключение. MiniDumpWriteDump делает что-то, что вызывает исключение, перехватывает его внутреннее исключение и продолжает работу. Я действительно не знаю, зачем он это делал. Вы можете просто проигнорировать это и продолжить. Вроде безобидно.

Я столкнулся с аналогичными проблемами при вызове других (непрозрачных) системных API-вызовов. Сам вызов внутренне перехватывает собственные исключения. Отладчик не знает, будут ли они пойманы или нет, и ломает их.

Они не должны отображаться в режиме выпуска.

Другие вопросы по тегам