WinDBG 用法详解(5)- 建立调试会话

建立调试会话是开始调试的必须步骤。在调试会话建立以前,除了少数选项设置和用于建立调试会话的命令可以执行外,其它大多数命令都是被禁止的。只有建立调试会话后,WinDBG 才允许执行其它命令。本节我们将讨论与各种不同调试目标建立调试会话的方法。

 

5.1 附加到已经运行的进程

有以下几种方法可以把调试器附加到已经运行的进程。
使用WinDBG 的File 菜单中的Attach to a Process 命令,或者按F6 热键,然后在进程列表中选择要附件的进程。
将WinDBG 设置为JIT 调试器,这样当应用程序崩溃时,在应用程序错误对话框中选择Debug 系统便会启动WinDBG 并将其附加到这个进程。详细情况请参见第11 章关于应用程序错误和JIT 调试器的讨论。
启动WinDBG 时通过-p 开关指定要附加的进程ID,让WinDBG 启动后便会附加到这个进程。
启动WinDBG 时通过-pn 开关指定要附加进程的程序名,让WinDBG 启动后便会附加到这个进程。
使用.attach 命令,使用这种方法需要现有一个调试会话,然后才能输入这个命令,因此这种方法常用于同时调试多个目标时的情况。
当调试系统服务或者被其它程序自动启动的程序时,通常需要使用上面介绍的方法来建立调试会话。如果要调试的程序可以在WinDBG 中启动,那么可以使用下面介绍的创建并调试新进程的方法。

 

5.2 非入侵式调试

非入侵式调试是一种特别的调试用户态进程的方式。使用这种方式,WinDBG 与目标进程没有真正建立调试与被调试的关系,因此不可以执行控制目标程序执行的各种命令,包括单步跟踪、继续执行等。但是可以执行观察栈、内存数据等操作。非入侵式调试的好处是减小调试器对目标进程的干预,最大程度的减少黑森博格效应。
非入侵式调试只适用于附加到已经运行进程的情况。对于图形界面方式附加到一个进程,那么只要选中对话框中的Noninvasive 复选框。对于使用命令行的情况,只要加上-pv 开关。如果使用.attach 命令,那么只要加上-v 开关。JIT 调试不支持这种方式。
因为没有建立真正的调试关系,所以使用一个WinDBG 以非入侵方式调试一个进程时,不会影响其它调试器再附加到这个进程进行普通的调试。
因为Windows NT 和Windows 2000 这样的系统不支持调试器与调试目标分离(Detach),一旦建立调试关系,那么调试会话终止就会终止被调试进程,所以对于这些系统,以非入侵方式调试有时很有用。

 

5.3 创建并调试新的进程

与将调试器附加到已经运行的进程类似,创建并调试一个新的程序也有很多种方法:
使用WinDBG 的File 菜单中的Open Executatble 命令,或者按Ctrl+E 热键,然后使用图30-5 所示的打开可执行文件对话框选择要调试的程序文件,并可以可选的指定程序的命令行参数和启动目录。
启动WinDBG 时将要调试的程序文件做为命令行参数传递给WinDBG。
在注册表的HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Image File Execution 键下,创建一个以要调试程序文件名(不包括路径)命名的子键,然后在这个子键下建立一个名为Debugger 的REG_SZ 类型的键值,取值为WinDBG 程序的完整路径,比如c:/windbg/windbg.exe。有了这个设置后,再运行要调试的程序时,操作系统就会先启动WinDBG,并把要执行的程序名和路径传递给它。
使用.create 命令,使用这种方法需要现有一个调试会话,然后才能输入这个命令,因此这种方法常用于同时调试多个目标时的情况。
无论使用哪种方法,被调试程序都是作为WinDBG 的子进程而被创建的,WinDBG 在创建这个子进程时会指定要与这个程序建立调试关系。

 

图30-5 WinDBG 的打开可执行文件对话框

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值