NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----12

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:

指派固定名称的别名的值。可以指定为数字值n0xn或其他任意字符串。查看使用别名获得更多信息。没有等价的命令行参数。

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下的进程都被指派了一个唯一的十进制数字,称为进程 IDPID。当附加调试器的时候,这个数字用于指定进程。

有很多方法可以知道指定程序的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可以通过各种方式处理用户模式错误。下面按优先顺序列出了错误处理方式:

  1. 如果出错进程已经附加上了用户模式调试器,所有错误都会使得目标中断到调试器。

    在用户模式调试器已经附加上去的时候,不会再使用其他错误处理方法,即使使用了gn (不处理异常并继续) 命令。

  2. 如果没有附加调试器并且执行的代码有自己的异常处理程序(例如try-except),异常处理程序会被尝试用于处理错误。
  3. 如果没有用户模式调试器附加,并且Windows打开了内核调试连接,并且错误是一个断点中断,Windows会尝试联络内核调试器。

    内核调试连接必须在Windows引导过程中就打开。如果运行Windows Server 2003或之后的Windows,并且希望避免从用户模式中断到内核调试器,可以使用KDbgCtrl 实用工具和-du参数。关于如何配置内核调试连接及如何使用KDbgCtrl,查看在目标机上配置软件

    如果Windows尝试联系内核调试器,但是在连接的另一端没有调试器运行,Windows会停止并等待内核调试器激活。

    在内核调试器中,可以使用gh (处理异常并继续) 来忽略错误并继续运行目标。使用了gn (不处理异常并继续) 命令来跳过内核调试器并进入第4步。

  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 -iaecdb -iaec KeyString。使用-iaec开关时, KeyString 指定添加到AeDebug 注册表键后面的字符串。该命令如果成功不会有消息显示,但是失败会有提示。如果CDB是即时调试器,当应用程序崩溃时,它会自动被激活。
  • 要将即时调试器修改为NTSD,运行ntsd –iaentsd -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计算机上,有两个用于即时调试的注册表键:

  1. 出错的64位应用程序会根据保存在\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug 中的键来调试。
  2. 出错的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检查是否DebuggerAuto键值存在。

如果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

  1. 在Windows 9x/Me计算机上安装Microsoft Layer for Unicode (MSLU)。可以在Microsoft Layer for Unicode on Windows 95, 98, and Me Systems下载。
  2. 在一个基于NT内核的Windows机器上下载并安装Windows调试工具包。详细信息,查看从网页安装
  3. 在Windows 9x/Me电脑上创建一个新文件夹。
  4. 将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

posted on 2008-04-08 15:13 NetRoc 阅读(1578) 评论(0)  编辑 收藏 引用 所属分类: WinDbg文档翻译

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜