cc682/NetRoc
http://netroc682.spaces.live.com/
用户模式设置
本节包含:
用户模式调试的硬件设置
用户模式调试的软件设置
使用即时调试
用户模式调试的硬件配置
用户模式调试一般是在单台机器上进行的:调试器和发生异常的应用程序运行在相同的计算机上。
在这种情况下,不需要进行特别的硬件配置。本文档中,术语主控机(host computer)和目标机(target computer)在这种情况下是可互换的。
如果要在两台机器上进行用户模式调试,参照内核模式调试的硬件配置来设置主控机和目标机。
用户模式调试的软件配置
本节包含:
基本用户模式配置
配置tools.ini
查找进程 ID
基本用户模式配置
进行用户模式调试之前,必须安装必要的符号文件并设置一些环境变量。
安装符号文件
必须安装被调试的用户模式进程的符号文件。如果这是自己编写的程序,应该生成完整符号文件。如果是商业软件,符号文件可能在产品磁盘上;如果没有,可以联系开发商。
如果可能,还应该安装该用户模式程序运行的Microsoft Windows版本对应的符号文件。
如果进行远程调试,符号文件的位置由采用的调试方式决定:
关于正确安装符号文件的更多信息,查看符号。
配置环境变量
调试器使用多个环境变量来进行重要设置。
用户模式调试使用的环境变量的完整列表,查看一般环境变量。
配置 tools.ini
启动时,CDB(或NTSD) 在tools.ini文件中搜索[NTSD]节,并在该节下读取初始化信息。环境变量INIT必须指向包含tools.ini文件的目录。
tools.ini 中[NTSD]节下的入口在下表中列出。
关键字和值之间必须用空格或者冒号分隔。关键字不是大小写敏感的。
对于TRUE和FALSE的值,"FALSE"是唯一表示假的值,其他任何值都表示真。
入口
|
说明
|
$u0: 值 ... $u9: 值
|
指派固定名称的别名的值。可以指定为数字值n或0xn或其他任意字符串。查看使用别名获得更多信息。没有等价的命令行参数。
|
DebugChildren: 标志
|
TRUE或者FALSE。如果为TRUE,CDB调试指定程序以及它可能创建的子进程。等价的命令行参数为-o。
|
DebugOutput: 标志
|
TRUE或者FALSE。如果为TRUE,CDB通过一个终端发送和接收数据。如果为FALSE,输出到用户屏幕上。命令行选项-d功能类似,但是有所不同。
|
IniFile: 文件
|
设置CDB或KD在启动时用于获取命令的脚本文件。默认值为当前目录下的ntsd.ini文件 。等价的命令行参数为-cf。更多信息,查看使用脚本文件。
|
LazyLoad: 标志
|
TRUE或者FALSE。如果为TRUE,CDB进行延迟符号加载;既直到需要的时候才加载符号。等价的命令行为-s。详细信息和设置这个选项的其他办法,查看符号延迟加载。
|
SetDll: 文件名
|
设置扩展DLL。.dll扩展名需要省略。默认为userexts.dll。等价的命令行为-a。详细信息和设置这个选项的其他办法,查看加载调试器扩展DLL。
|
StopFirst: 标志
|
TRUE或者FALSE。如果为TRUE,CDB在加载完进程映像之后中断。等价的命令行为-g。
|
StopOnProcessExit: 标志
|
TRUE或者FALSE。如果为TRUE,CDB在接收到进程终止的信息时中断。等价命令行为-G。
|
sxd: 事件
sxe: 事件
|
为指定的异常或事件设置调试器的相应和处理状态。
异常和事件可以按照下面的方式设定:
*:默认异常
N:异常 n(十进制)
0xn:异常0xn(十六进制)
(other):事件代码
查看控制异常和事件获得关于该设置的详细信息,以及其他控制该设置的方法。
|
VerboseOutput: 标志
|
TRUE或者FALSE。如果为TRUE,CDB将显示符号处理、事件通知和其他运行时事件的详细信息。等价命令行为-v。
|
下面是一个tools.ini文件中的[NTSD]节的示例内容:
[NTSD]
sxe: 3c
sxe: cc
$u0: VeryLongName
VerboseOutput:true
tools.ini 文件不会影响WinDbg或KD。
查找进程ID
每个运行于Microsoft Windows下的进程都被指派了一个唯一的十进制数字,称为进程 ID或PID。当附加调试器的时候,这个数字用于指定进程。
有很多方法可以知道指定程序的PID:使用任务管理器、使用tasklist命令、使用TList实用工具或者调试器。
任务管理器
任务管理器可以通过很多办法打开,最简便的是按下CTRL+ALT+DELETE 并点击任务管理器。
如果选择了进程选项卡,所有进程和它的PID以及其他有用信息都会被列出。
一些内核错误可能使得任务管理器的图形界面延迟。
Tasklist 命令
在Windows XP和之后版本的Windows中,可以在命令提示符窗口使用tasklist命令。用于显示所有进程、特们的PID和其他详细信息。
TList
TList (任务列表查看器, tlist.exe) 是一个命令行实用程序,用于显示当前本地计算机的任务列表、用户模式进程。TList 包含在Windows调试工具包中。
当从命令提示符运行TList时,它会显示内存中的所有用户模式进程和他们的PID。对每个进程,会显示PID、进程名,如果进程有窗口,它会显示窗口标题。
更多信息,查看TList。
.tlist 调试器命令
如果在机器上已经运行了一个用户模式调试器,.tlist (列举进程ID)命令会显示系统中所有PID的列表。
CSRSS和用户模式驱动程序
要调试在另外一台机器上运行的用户模式驱动程序,选择CSRSS进程(Windows子系统进程)。该进程的PID始终为-1。更多信息,查看使用NTSD调试CSRSS 。
启用即时调试
大多数公共的应用程序错误称为异常。包括访问违例、除零、数字溢出和一些其他种类的错误。
应用程序也可能产生断点中断。当Windows不能继续运行程序(例如必须的模块不能加载)或者当遇到断点的时候会产生。断点可以由调试器插入代码中,也可以通过对类似DbgBreakPoint这样的函数调用产生。在汇编语言中,断点一般由int 3指令产生。
Windows可以通过各种方式处理用户模式错误。下面按优先顺序列出了错误处理方式:
-
如果出错进程已经附加上了用户模式调试器,所有错误都会使得目标中断到调试器。
在用户模式调试器已经附加上去的时候,不会再使用其他错误处理方法,即使使用了gn (不处理异常并继续) 命令。
- 如果没有附加调试器并且执行的代码有自己的异常处理程序(例如try-except),异常处理程序会被尝试用于处理错误。
-
如果没有用户模式调试器附加,并且Windows打开了内核调试连接,并且错误是一个断点中断,Windows会尝试联络内核调试器。
内核调试连接必须在Windows引导过程中就打开。如果运行Windows Server 2003或之后的Windows,并且希望避免从用户模式中断到内核调试器,可以使用KDbgCtrl 实用工具和-du参数。关于如何配置内核调试连接及如何使用KDbgCtrl,查看在目标机上配置软件。
如果Windows尝试联系内核调试器,但是在连接的另一端没有调试器运行,Windows会停止并等待内核调试器激活。
在内核调试器中,可以使用gh (处理异常并继续) 来忽略错误并继续运行目标。使用了gn (不处理异常并继续) 命令来跳过内核调试器并进入第4步。
-
如果上面1、2、3步骤的条件都不满足,Windows将激活一个调试工具。任何程序都可以将自己设置为在这种情况下使用的工具。被选定的程序称为即时调试器。也称为just-in-time 调试器或者JIT调试器。
如果即时调试器是标准的用户模式调试器(如CDB、WinDbg或者Microsoft Visual Studio),该调试器会被启动起来并且中断应用程序。
如果即时调试器是用于创建dump文件的工具(如Dr. Watson),将会创建一个内存转储(dump)文件,并且应用程序将被终止。
注意 如果Dr. Watson 在Windows XP或之后版本Windows中被激活,会出现一个消息框。这个窗口提供选项来发送错误报告给Microsoft。如果选择不发送(Don't Send),一个dump文件会被创建并保存到磁盘中。如果选择发送错误报告,dump文件会被创建并保存,同时将通过网络发送给Microsoft。
如果没有重新配置过即时调试设置,默认的即时调试器是Dr. Watson 。这个设置可以通过编程或者注册表修改,并且立即生效。
- 要将即时调试器修改为WinDbg,运行windbg -I 。(I必须大写。)使用该命令后会显示成功或者失败的消息。当WinDbg是即时调试器的时候,任何应用程序崩溃时它都会激活。
- 要将即时调试器修改为CDB,运行cdb -iae 或 cdb -iaec KeyString。使用-iaec开关时, KeyString 指定添加到AeDebug 注册表键后面的字符串。该命令如果成功不会有消息显示,但是失败会有提示。如果CDB是即时调试器,当应用程序崩溃时,它会自动被激活。
- 要将即时调试器修改为NTSD,运行ntsd –iae或 ntsd -iaec KeyString。使用-iaec开关时, KeyString 指定添加到AeDebug 注册表键后面的字符串。如果KeyString 包含空格,则它必须用引号括起来。该命令如果成功不会有消息显示,但是失败会有提示。如果NTSD是即时调试器,当应用程序崩溃时,它会自动被激活。
- 要将即时调试器恢复成Dr. Watson,运行drwtsn32 –i。当Dr. Watson为即时调试器时,应用程序崩溃时会生成内存dump文件。查看 Dr. Watson命令行选项 获得详细信息。
只有系统管理员可以修改即时调试设置。
如果安装了即时调试器,用户模式应用程序可以通过调用DebugBreak 函数来主动中断到调试器中。
编辑注册表
即时调试设置被保存在注册表中。如果想控制这些设置,推荐使用上面描述过的WinDbg、CDB、NTSD或Dr. Watson 命令;他们将会自动修改相应的注册表键。如果要自己修改注册表,注意要非常小心,对注册表的不合适修改会造成Windows不能使用。
在x86计算机上,即时调试设置保存在\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug 键。
在Intel Itanium计算机上,有两个用于即时调试的注册表键:
- 出错的64位应用程序会根据保存在\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug 中的键来调试。
- 出错的32位应用程序会根据保存在\\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug 键中的内容来调试。但是,如果该键的Debugger键值 指定了%windir%\system32 目录中的程序,Windows将会在%windir%\syswow64 中查找它。
当使用Itanium计算机时,通常简单的为这些键指定相同的值。特别的,如果使用WinDbg、CDB或NTSD作为即时调试器,在Itanium计算机上32位和64位用户模式程序都会使用同一个版本的调试器。查看选择32位或64位调试器包获取更多信息。
这些键中可能出现的键值有两个:
Debugger
这个REG_SZ 值指定用于进行即时调试的调试器。必须列出调试器的全路径,除非调试器在默认路径下。
Auto
这个REG_SZ值总是0或者1 。如果Auto 设置为0,在即时调试器打开前会先显示一个消息框。
当应用程序产生未处理的异常时,Windows检查是否Debugger 和Auto键值存在。
如果Auto 值为0,会出现一个消息框。
在Windows NT和Windows 2000中,这个消息框会是下面的格式之一:
- 如果Debugger 值包含有效调试器的名字或者Dr. Watson ,消息框包含两个按钮:确定(OK) 和取消(Cancel)。如果点击了确定,程序将被终止。如果点击取消,会启动Debugger 值中指定的工具。
- 如果Debugger 值为空,消息框只有确定(OK)按钮,并且不会启动调试器。
在Windows XP和之后的Windows中,消息框会是下面格式之一:
- 如果Debugger 值包含有效调试器的名字或者Dr. Watson ,消息框包含三个按钮:发送错误报告(Send Error Report)、不发送(Don't Send)和调试(Debug)。如果选择不发送,应用程序被终止。如果选择发送错误报告,则向Microsoft发送一个minidump文件,程序会被终止。如果点击调试按钮,Debugger 值指定的调试器会启动。(注意所有这些按钮的作用和当Auto不为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 使得调试器跳过初始断点。 (Dr. Watson 跳过 -g 选项。)
安全漏洞
如果想要在公用计算机上使用即时调试,查看即时调试的安全性。
Windows 95, 98, 和Millennium
WinDbg、CDB和NTSD可以在Windows 95、Windows 98和Windows Millennium Edition上调试用户模式程序。这需要安装时进行一些附加步骤,并且功能上有所限制。这些系统上不支持内核调试。
这三个操作系统被统称为"Windows 9x/Me"。
本节包含:
在Windows 9x/Me上安装调试器
Windows 9x/Me上的调试限制
Windows 9x/Me上的内核调试
在Windows 9x/Me上安装调试器
Windows调试工具包在Windows 9x/Me上的安装由于两个原因要更加复杂一些。首先,这些系统没有原生的Unicode支持,所以需要支持Unicode。其次,Windows调试工具包使用的安装程序不兼容这些系统。
在Windows 9x/Me 上安装Windows调试工具包,按以下步骤操作。
To install the debugging tools on a Windows 9x/Me system
- 在Windows 9x/Me计算机上安装Microsoft Layer for Unicode (MSLU)。可以在Microsoft Layer for Unicode on Windows 95, 98, and Me Systems下载。
- 在一个基于NT内核的Windows机器上下载并安装Windows调试工具包。详细信息,查看从网页安装。
- 在Windows 9x/Me电脑上创建一个新文件夹。
- 将Windows调试工具包的文件从NT内核Windows的机器上拷贝到Windows 9x/Me 机器上。
Windows 9x/Me 上的调试限制
在Windows 9x/Me 上使用调试器的方式和在基于NT内核的Windows上基本上相同,只是有一些功能限制。
总的来说大多数功能都能使用,包括使用.dump 命令创建dump文件。
有下面一些限制:
调试器扩展
操作系统相关的调试器扩展不会被加载,所以有一些通常可用的命令不能使用。
远程调试
当使用CDB时通过.server命令创建的远程功能不能使用。WinDbg的远程调试能够正常工作。
命名管道在Windows 9x/Me上不被支持, 通过调试器进行的远程调试需要使用TCP/IP传输。
符号
Windows 9x/Me 的核心符号是.sym格式的。Windows调试工具包不兼容这种格式。所有.dbg 或 .pdb 格式的符号可以正常工作。
GDI32.dll中的第一次异常处理 (First Chance Exceptions)
如果调试一个图形界面程序,会在GDI32.dll 代码中看到非常大量的第一次异常处理。这是正常的情况,但是会使得和图形应用程序的交互变的困难。要避免被这种情况中断,可以通过如下方法配置调试器跳过这些异常:
- 使用 -xd av 命令启动调试器。这使得调试器忽略第一次异常处理。
- 在CDB或者WinDbg的调试器命令窗口中输入sxd av 命令。使得调试器忽略第一次异常处理。
- 使用WinDbg的Event Filters 对话框,指定调试器忽略对访问违例的第一次异常处理。
关于这些方法的详细信息,查看控制异常和事件。
Windows 9x/Me 上的内核调试
Windows调试工具在Windows 9x/Me 系统上不能用于内核调试。
要进行内核调试,必须使用WDeb 系列的调试器(例如wdeb386.exe)或者Microsoft Windows系统调试器(debugger.exe)。关于在Windows 9x上内核调试的更多信息,查看Windows Millennium Edition DDK 或者Debugging Tools for Windows Me。