我在C ++ / CLI中从进程“ 1”产生了进程“ 2”。两者都在运行时,进程“ 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”时,当我移至对MiniDumpWriteDump
的调用时,会收到2-3 AccessViolationException ,但是如果单击“继续”,一切都会进行很好,并生成了转储文件。
这是怎么回事?我的设计有问题吗?请注意,这是我第一次使用此API,我什至不知道我可以在24小时前转储此类文件;-)!非常感谢您的帮助,以提高我的转储文件技能。
编辑1 :添加了异常信息:
这是我收到的消息:
MYProg.exe中的0x000007FED860FD31(mscordacwks.dll)引发异常: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
答案 0 :(得分:0)
就像上面评论中提到的 Hans Passant 一样,这似乎是一个内部/捕获的异常。 MiniDumpWriteDump 执行一些导致异常的操作并捕获其内部异常并继续。我真的不知道为什么它会这样做。您可以忽略它并继续。看起来无害。
我在调用其他(不透明)系统 API 调用时遇到了类似的问题。调用本身在内部捕获自己的异常。调试器不知道它们是否会被捕获并中断它们。
它们不应该出现在发布模式中。