无法检测到第二次机会exception?

我试图编写一个小的应用程序,通过它的IDdebugging另一个进程,并监视应用程序,直到它崩溃。 现在我已经写了一个小代码,大部分来自MS编写debugging器的例子。

即使在目标崩溃后,我的目标应用程序也不会通过if(!de.u.Exception.dwFirstChance)。

如果我在if(!de.u.Exception.dwFirstChance)上放置一个bp,我能够看到exception,但是没有exception符合条件。

PS:太多的编辑:/

#include "stdafx.h" #include <windows.foundation.diagnostics.h> #include <debugapi.h> #include <ntstatus.h> DEBUG_EVENT de; int _tmain(int pid) { DebugActiveProcess( pid); while (true) { int a; if (WaitForDebugEvent (&de, (DWORD)1000)) { if (de.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) { if(!de.u.Exception.dwFirstChance) int excep = de.u.Exception.ExceptionRecord.ExceptionCode; } } ContinueDebugEvent ( de.dwProcessId, de.dwThreadId, DBG_CONTINUE); } } 

文章“为Sysinternals ProcDump v4.0编写一个插件”在伪代码中指示, (并且仅当)出现“第二次机会异常”时,被监视进程的转储产生。

 // (extract altered for brevity) Else "Second Chance Exception" WriteDump(..) Done = True 

和“编写一个基本的Windows调试器”表示EXCEPTION_DEBUGINFO.dwFirstChance ,与警卫STATUS_BREAKPOINT / EXCEPTION_BREAKPOINT可用于检测这种情况。

“第一次和第二次机会异常处理”(KB105676)解释了异常机会类型之间的区别:

但是,如果正在调试应用程序, 则调试程序会在程序执行之前看到所有[第一次机会]异常 。 这是第一次和第二次机会异常之间的区别:调试器获得第一次看到异常(因此名称)的机会。

正在被检测到的是这些第一次机会异常(“被管理”或不是),但是它们几乎都是可恢复的 – 即它们被应用程序/运行时代码捕获,并得到适当处理。

如果调试器允许程序继续执行并且不处理异常,那么程序将像往常一样看到异常。 如果程序没有处理异常,调试器有第二次机会看到异常。 在后一种情况下, 如果调试器不存在程序通常会崩溃。

因此,procdump可能会产生第二次机会异常的转储,假定任何进程致命的异常不会被压制(另一个调试器,因为程序放弃了它的机会)。

(EXIT_PROCESS_DEBUG_EVENT 进程终止之后发生因此不能生成适当的转储,尽管它发出信号以结束监视。)


YMMV:所有的信息/观察都来自所列的文章和资源,没有实际使用这些技术的经验。

以前有关于单步异常的问题/回答: 什么是单步异常?

您列举的每个异常都会在您的应用程序未处理时崩溃。 网上有很多关于每个的信息。

简单的新手建议:你是第一个遇到问题或想知道什么是什么意思的人是不太可能的。 谷歌是这样的事情更合适的工具。 谷歌第一,StackExchange如果你找不到答案。