我正在尝试编写一个小应用程序,通过其ID调试另一个进程并监视应用程序,直到它崩溃。 现在我已经编写了一个小代码,其中大部分来自编写调试器的MS示例。
我的目标应用程序永远不会传递if(!de.u.Exception.dwFirstChance),即使在目标崩溃后也是如此。
如果我在if(!de.u.Exception.dwFirstChance)上放了一个bp,我就能看到异常,但没有异常符合条件。
P.S:编辑太多:/
#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);
}
}
答案 0 :(得分:1)
文章"Writing a Plug-in for Sysinternals ProcDump v4.0"在伪代码中表明,当(仅当)发生“第二次机会例外”时,生成受监视进程的转储。
// (extract altered for brevity)
Else "Second Chance Exception"
WriteDump(..)
Done = True
"Writing a basic Windows debugger"表示EXCEPTION_DEBUGINFO.dwFirstChance可以使用STATUS_BREAKPOINT / EXCEPTION_BREAKPOINT保护来检测此情况。
"First and second chance exception handling" (KB105676)解释了异常机会类型之间的区别:
但是,如果正在调试应用程序,调试器会在程序执行之前看到所有[第一次机会]异常。这是第一次和第二次机会异常之间的区别:调试器第一次看到异常(因此得名)。
正在检测这些第一次机会例外(“管理”或“管理”),但它们几乎都是可恢复的 - 即它们被应用程序/运行时代码捕获并适当处理。
如果调试器允许程序执行继续并且不处理异常,程序将像往常一样看到异常。 如果程序没有处理异常,调试器会有第二次机会看到异常。在后一种情况下,如果调试器不存在,程序通常会崩溃。
因此,procdump可能会为第二次机会异常生成转储,并假设任何进程致命异常都不会被抑制(由另一个调试器,因为程序放弃了它的机会)。
(在进程终止后发生,因此生成适当的转储为时已晚,尽管它确实发出结束监控的信号。)
YMMV:所有信息/观察都来自所列出的文章和资源,没有使用此类技术的实际经验。
答案 1 :(得分:0)
有一个关于单步例外的问题/答案:What is a single step exception?
如果未处理,您枚举的每个异常都会导致应用程序崩溃。网上有很多关于每个的信息。
简单的新手建议:你是第一个遇到问题或不知道是什么意思的人。对于像这样的事情,谷歌是一个更合适的工具。谷歌首先,StackExchange,如果你找不到答案。