我一直在想,应用程序抛出未处理的异常和附加到进程的调试器之间会发生什么。显然这些信息就在我眼皮底下,但我是瞎子。Windows调试器关于事后调试的文档包含了您想要知道的所有详细信息。
最常见的应用程序错误称为异常。这些错误包括访问冲突、除以零错误、数字溢出和许多其他类型的错误。应用程序也可能导致断点中断。当Windows无法运行应用程序(例如,无法加载必需的模块)或遇到断点时,会发生这些情况。断点可以由调试器插入到代码中,也可以通过DbgBreakPoint等函数调用。在汇编语言中,断点中断是由int 3指令生成的。
Windows可以通过多种方式处理用户模式错误。以下顺序显示了用于错误处理的优先级:
  1. 如果用户模式调试器当前附加到错误进程,则所有错误都将导致目标进入此调试器。
    只要附加了用户模式调试器,就不会使用其他错误处理方法—即使使用了gn(Go With Exception Not Handled)命令。
  2. 如果没有附加用户模式调试器,并且正在执行的代码有自己的异常处理例程(例如,try-except),则此异常处理例程将尝试处理错误。
  3. 如果没有附加任何用户模式调试器,但Windows具有打开的内核调试连接,并且错误是断点中断,则Windows将尝试联系内核调试器。
    在Windows启动过程中必须打开内核调试连接。如果使用的是Windows Server 2003或更高版本的Windows,并且希望防止用户模式中断闯入内核调试器,则可以将KDbgCtrl实用程序与-du参数一起使用。如果Windows确实尝试联系内核调试器,但连接的另一端没有运行调试器,则Windows将冻结,直到激活内核调试器。在内核调试器中,可以使用gh(gowithexceptionhandled)忽略错误并继续运行目标。您可以使用gn(Go With Exception Not Handled)绕过内核调试器并继续执行步骤4。
  4. 如果步骤1、2和3中的条件不适用,Windows将激活调试工具。在这种情况下,可以预先选择任何程序作为工具。所选程序称为后期调试器。这也被称为即时调试器或JIT调试器。
    如果后期调试器是标准的用户模式调试器(如CDB、WinDbg或Microsoft Visual Studio),则此调试器将启动并进入应用程序。如果后期调试器是用于写入转储文件的工具(如Dr.Watson),则将创建内存转储文件,然后终止应用程序。
注意:如果在Windows XP或更高版本的Windows上激活Dr.Watson,则会出现一个消息框。此窗口提供向Microsoft发送错误报告的选项。如果选择不发送,将创建一个转储文件并存储在硬盘上。如果选择“发送错误报告”,将创建一个转储文件并将其存储在硬盘上,还将通过internet传输到Microsoft。
如果尚未重新配置Windows的事后调试设置,则使用Dr.Watson作为默认事后调试器。可以通过编程方式或注册表更改此设置;任何更改都会立即生效。
  • 若要将后期调试器更改为WinDbg,请运行WinDbg-I(I必须大写)。使用此命令后,将显示成功或失败消息。当WinDbg是后期调试器时,它将在应用程序崩溃时被激活。
  • 要将后期调试器更改为CDB,请运行CDB-iae或CDB-iaec键字符串。。使用-iaec开关时,key
    string指定要添加到AeDebug注册表项末尾的字符串。此命令成功时不显示任何消息,但失败时将显示失败消息。当CDB是后期调试器时,它将在应用程序崩溃时被激活。
  • 要将后期调试器更改为NTSD,请运行NTSD-iae或NTSD-iaec键字符串。。使用-iaec开关时,key string指定要添加到AeDebug注册表项末尾的字符串。如果键字符串包含空格,则必须用引号括起来。此命令成功时不显示任何消息,但失败时将显示失败消息。当NTSD是后期调试器时,它将在应用程序崩溃时被激活。
  • 要将后期调试器更改回Dr.Watson,请运行drwtsn32-i。当Dr.Watson是后期调试器时,如果应用程序崩溃,内存转储文件将写入磁盘。
注意:只有系统管理员才能更改后期设置。如果安装了后期调试器,则可以通过调用DebugBreak函数从用户模式应用程序中进入调试器。
 
后期调试设置存储在注册表中。如果要控制这些设置,建议您使用上述WinDbg、CDB、NTSD或Dr.Watson命令;这些命令将自动更改相关注册表项。如果确实需要手动编辑注册表,请非常小心地进行编辑,因为对注册表的不正确更改可能会导致Windows系统不可用。
在x86计算机上,后期调试设置存储在\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug。在英特尔安腾计算机上,有两个注册表项用于后期调试:
  • 64位的存储在\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
  • 32位存储在\\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug。但是,如果此键中的调试器值指定了%windir%\system32目录中的应用程序,则Windows将改为在%windir%\syswow64中查找。
使用安腾计算机时,通常最简单的做法是在每个键中放置相同的值。特别是,如果您使用WinDbg、CDB或NTSD作为后期调试器,则安腾计算机上的32位和64位用户模式应用程序将使用相同的版本。
在这些键中应该出现两个注册表值:
  • Debugger
    此REG_SZ值指定将处理后期调试的调试器。必须列出调试器的完整路径,除非调试器位于默认路径中的目录中。
  • Auto
    此REG_SZ值始终为0或1。如果Auto设置为0,则在后期调试之前将显示一个消息框。
当出现未处理的应用程序错误时,Windows将检查是否存在DebuggerAuto注册表值。如果Auto值为0,在Windows NT和Windows 2000中,消息框将具有以下格式之一:
  • 如果Debugger的值是一个有效调试器或者是Dr.Watson,消息框会有"OK"和“Cancel”两个按钮,点击OK,应用程序将终止,点击Cancel调试器将启动。
  • 如果Debugger为空,消息框只有一个OK按钮,且不会启动调试
在Windows XP和更高版本的Windows中,消息框将具有以下格式之一:
  • 如果Debugger的值是一个有效调试器或者是Dr.Watson,消息框会有"Send Error Report"、“Don't Send”和“Debug”三个按钮,如果按下“Don't Send”按钮,则应用程序将终止。如果按下“Send Error Report”按钮,将向Microsoft发送一个小型转储文件,应用程序将终止。如果按下“Debug”按钮,将启动调试器值中指定的工具。(请注意,当“自动”值不等于0时,所有这些按钮的效果都与Dr.Watson的消息窗口上的按钮不同。)
  • 如果Debugger为空,消息框只有"Send Error Report"和“Don't Send”按钮
如果Auto值等于1,则不显示消息框。Debugger值中引用的调试器将自动启动。
 
以下注册表值可用于将Dr.Watson设置为后期调试器(这是默认值):
Debugger = "drwtsn32 -p %ld -e %ld -g"
Auto = 1
以下值可用于将WinDbg设置为后期调试器:
Debugger = "Path\WinDbg -p %ld -e %ld"
Auto = 1
以下值可用于将CDB设置为后期调试器:
Debugger = "Path\CDB -p %ld -e %ld -g"
Auto = 1
在这些示例中,Path是调试器所在的目录,-p%ld指定要调试的进程ID,-e%ld提供导致异常的事件,-g使调试器跳过初始断点。

关于Windows系统里的事后调试的更多相关文章

  1. 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  2. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  3. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cm ...

  4. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的完全卸载(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 若你不想用了,则可安全卸载. 完全卸载Oracle ...

  5. 全网最详细的Windows系统里Oracle 11g R2 Database服务器端(64bit)的下载与安装(图文详解)

    不多说,直接上干货! 环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Or ...

  6. 全网最详细的Windows系统里PLSQL Developer 64bit安装之后的一些配置(图文详解)

    不多说,直接上干货! 注意的是: 本地若没有安装Oracle服务端,Oracle server服务端64位,是远程连接,因此本地配置PLSQL Developer64位. PLSQL Develope ...

  7. 全网最详细的Windows系统里PLSQL Developer 32bit的下载与安装过程(图文详解)

    不多说,直接上干货! 注意的是: 本地若没有安装Oracle服务端,Oracle server服务端32位,是远程连接,因此本地配置PLSQL Developer32位. PLSQL Develope ...

  8. 全网最详细的Windows系统里PLSQL Developer 64bit的下载与安装过程(图文详解)

    不多说,直接上干货! ORACLE是数据库,有客户端和服务器: 其,具体下载,可见http://www.oracle.com/technetwork/database/enterprise-editi ...

  9. windows系统里Cygwin中如何正确安装wget(图文详解)

    具体步骤,见如下: https://ftp.gnu.org/gnu/wget/ 解压到Cygwin的主目录中,一般是   你的Cygwin目录/home/当前用户名/ . 我这是如下     先./c ...

随机推荐

  1. Python 基础 格式化输出

    Python 基础 格式化输出 现在需要我们录入我们身边好友的信息,格式如下: ------------ info of Alex Li ---------- Name : Alex Li Age : ...

  2. stone [期望]

    也许更好的阅读体验 \(\mathcal{Description}\) 有 \(n\) 堆石子,依次编号为 \(1, 2,\ldots , n\),其中第 \(i\) 堆有 \(a_i\) 颗石子 你 ...

  3. CapsLock Enhancement via AutoHotKey

    上次写了一篇博文,讲如何通过AutoHotKey改造CaspLock,使其成为一个方便的编辑按键,并特意给出了设计的思路方便参考. 见地址:http://www.cnblogs.com/Vonng/p ...

  4. git 学习笔记 --Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...

  5. Ambari深入学习(I)-系统架构

    Ambari是hadoop分布式集群配置管理工具,是由hortonworks主导的开源项目.它已经成为apache基金会的孵化器项目,已经成为hadoop运维系统中的得力助手,引起了业界和学术界的关注 ...

  6. Sqlserver 总结(2) 存储过程

    目录 写在前面 什么是存储过程 存储过程的优点 存储过程的分类 1.只返回单一记录集的存储过程 2.没有输入输出的存储过程 3.有返回值的存储过程 4.有输入参数和输出参数的存储过程 5.同时具有返回 ...

  7. NEST 自定义分析器

    public void SetAnalysis() { if (!client.IndexExists("employee").Exists) { client.CreateInd ...

  8. win10 bcdedit testsigning

    win10 bcdedit testsigning # 禁用系统完整性检查和禁用驱动签名以及进入测试签名驱动模式> bcdedit.exe /set nointegritychecks on & ...

  9. A Deep Dive Into Draggable and DragTarget in Flutter

    https://medium.com/flutter-community/a-deep-dive-into-draggable-and-dragtarget-in-flutter-487919f6f1 ...

  10. 1.live555源码分析----RSTPServer创建过程分析

    最近五一回家,终于有机会能安静的看一下流媒体这方面相关的知识,准备分析live555的源码,接下来会把我读源码的过程记录成博客,以供其他的同路人参考. 因为再读源码的过程中,并不是一路顺着读下来,往往 ...