无法检测到第二次机会异常?

时间:2014-06-06 06:19:50

标签: c windows debugging

我正在尝试编写一个小应用程序,通过其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);

        }


    }

2 个答案:

答案 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,如果你找不到答案。