【调试技术】配置自动调试

文章目录
概述

Windows 场景下程序异常时,配置自动调试

相关参考:

配置自动调试

主要操作如下:

当应用程序停止响应(例如,访问冲突后),系统会自动调用注册表中指定的调试器进行事后调查调试。如果命令行配置正确,会将进程 ID 和事件句柄传递给调试器。 以下过程介绍如何在注册表中指定调试器。

将调试器设置为事后调查调试器

转到以下注册表项:

1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

使用指定调试器的命令行的 REG_SZ 字符串添加或编辑 Debugger 值。

该字符串应包含调试器可执行文件的完全限定路径。 使用 “%ld” 参数向调试器命令行指示进程 ID 和事件句柄。 不同的调试器可能具有自己的参数语法来指示这些值。 调用调试器时,会将第一个 “%ld” 替换为进程 ID,并将第二个 “%ld” 替换为事件句柄。

以下文本是如何将 WinDbg 设置为调试器的示例。

1
"C:\debuggers\windbg.exe" -p %ld -e %ld -g

如果希望在没有用户交互的情况下调用调试器,请使用 REG_SZ 字符串添加或编辑 Auto 值,该字符串指定系统是否应在调用调试器之前向用户显示对话框。

  • 字符串“1”会禁用对话框;
  • 字符串“0”会启用对话框。

开始自动调试

调试时,先用命令行方式启动 windgb.exe -IA 作为自动调试器。

运行 windbg -I

补充
如果是 Windbg Preview 版本,则需要运行 WindbgX -I,或者在 Windbg Preview 的界面手动打开,如下所示:

补充:Reg文件

将如下所示内容保存为 reg 文件,Debugger 替换为自己的

1
2
3
4
5
6
7
8
9
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"UserDebuggerHotKey"=dword:00000000
"Auto"="0"
"Debugger"="\"C:\\Program Files\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe\" -p %ld -e %ld -g"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList]
"DWM.exe"=dword:00000001

AutoExclusionList

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList 注册表说明

  • 该注册表项下的值(通常是 REG_DWORD 类型)列出了不应触发 JIT 调试器的可执行文件名(不含路径,仅文件名,如 explorer.exe)。
  • 即使系统配置了默认调试器,只要崩溃的进程名出现在此列表中,Windows 就会直接终止该进程而不启动调试器
  • 这有助于避免因调试器挂起关键进程而导致系统不稳定或用户体验变差。

内容可能如下(在注册表编辑器中):

名称(Name) 类型(Type) 数据(Value)
explorer.exe REG_DWORD 1
svchost.exe REG_DWORD 1
dllhost.exe REG_DWORD 1

注意:值数据通常设为 1,表示“启用排除”;不存在则表示不排除。