我从C++/CLI中的进程“1”派生出一个进程“2”。当两个进程都在运行时,进程“1”会终止进程“2”(按设计)。我的目标是在杀死“2”之前制作一个小型垃圾场。
这是我的代码:
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
添加了异常信息:
以下是我得到的信息:
在MYProg中的0x000007FED860FD31(mscordacwks.dll)处引发异常。exe:0xC0000005:访问冲突读取位置0x0000000000。
如果有此异常的处理程序,程序可以安全地继续。
编辑2
添加了一个代码片段和堆栈跟踪
过程1
:杀手
#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
字体“被抛弃”
#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!");
while ( true )
{
System::Threading::Thread::Sleep( 1000 );
}
return 0;
}
堆栈跟踪
当我把它从内部打破(
访问违规
)异常对话框:
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