您的位置:首页 > 其它

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

2010-05-19 20:02 405 查看
建立调试会话是开始调试的必须步骤。在调试会话建立以前,除了少数选项设置和用于建立调试会话的命令可以执行外,其它大多数命令都是被禁止的。只有建立调试会话后,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 的打开可执行文件对话框
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: