Я породил процесс "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