Windbg使用手册

一、安装

从下面的链接或其他链接下载安装:
Download Debugging tools for Windows

二、配置

常用的配置就是符号文件搜索路径、可执行文件搜索路径、源码文件搜索路径配置。

  • 符号文件搜索路径配置(Symbol File Path)
    在菜单项File-> Symbol File Path中设置,如D:\symbol_path;SRV*D:\symbolslocal*http://msdl.microsoft.com/download/symbols意思是先从D:\symbol_path中找符号文件;如果没找到,就去服务器中下载并保存到D:\symbolslocal目录中。
    可以使用.sympath+命令来添加其他目录到搜索路径中,如.sympath+ D:\other_symbol_dir。 然后使用.reload来根据新的路径重新搜索并加载符号文件。

  • Image File Path配置
    此项是在加载dump时,设置可执行文件exe、dll的路径的。

  • Source File Path配置
    设置源代码目录。如果当前指令指针在源代码范围内,就会自动跳出源文件窗口。源文件窗口中的操作和vs类似。如果没有跳出,可以单机菜单项Open Source File手动选择源文件

  • 启动命令
    可以使用对windbg加入启动参数,通过启动参数指定符号文件路径和源码路径等等。

start "" "%~dp0/Debuggers_x86/windbg.exe" -Q -y "D:\symbolslocal*http://msdl.microsoft.com/download/symbols" -srcpath "srv*C:\CodeCache"

三、开始调试

我们可以通过菜单项File -> Open Executable来加载本地的一个exe来进行调试,也可以通过菜单项File -> Attache to a Process来加载一个已经运行的exe来进行调试。
具体调试指令可以参考:
Help->Contents->Debugging Tools for Windows->Debuggers->Debugger Reference

四、工作空间

windbg会保存每个你调试的工程的信息,这些信息包括调试项目的属性、参数、会话状态、调试器设置、及图形界面信息,类似于ide的项目文件。
每个调试的工作空间信息默认保存在
HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces中,在这个键下一般有4个子键User、Kernel、Dump、Explicit, 他们分别保存用户态调试,内核态调试、转储文件调试、以及手动保存(Save Workspace As)的工作空间信息。

五、窗口界面介绍

名称热键用途
CommandAtl+1输入命令、显示命令结果和调试信息输出
WatchAtl+2观察指令全局变量、局部变量和寄存器的信息
LocalsAtl+3自动显示当前函数的所有局部变量
RegistersAtl+4观察和修改寄存器的值
MemoryAtl+5观察和修改内存数据
Call StackAtl+6栈中记录的函数调用序列
DisassemblyAtl+7反汇编
Scratch PadAtl+8白板,可以用来做调试笔记等
Processes and ThreadsAtl+9显示所有调试目标的列表,包括进程和线程等
Command BrowserCtrl+N执行和浏览命令

六、常用命令

windbg命令分为标准命令元命令扩展命令
.开头的元命令提供标准命令没有提供的功能,也内建在调试引擎中。
!开头的扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中。

tab键       自动完成命令
.hh         查看指定命令的帮助手册
.reload     重新加载符号文件 
.restart    重新启动调试目标 

bp $exentry 在程序入口点设置断点,$exentry是一个伪寄存器 
bp 0x00401030              在地址0x00401030处设置断点 
bp MyTestModule!MyTestFuncMyTestModule模块中的MyTestFunc函数处设置断点,前提是该模块符号已经加载 
bp MyTestModule!MyTestClass::SetValue        在模块MyTestModuleMyTestClass类成员函数SetValue处设置断点 
bp @@C++(MyTestModule!MyTestClass::SetValue) 与上面一样,语法不同,C++语法,上面的为MASM语法 
bl 查看设置的断点 
be 激活断点 
bd 禁用断点 
bc 删除某个断点 
ba              设置访问断点 
ba r 1 0044108c 在内存0044108c的位置开始的下一个字节的读断点 
ba w4@@C++(&i)  给变量i地址下4个字节的写断点 

g               运行程序,相当于F5 
gu              返回函数调用处,相当于shift+F11 


u               查看当前正要执行的代码 
k               查看当前调用堆栈 
~*kb           显示所有进程调用堆栈

~           查看调试进程中的线程信息 
!teb        线程环境块
~.          当前线程信息
~#          导致当前异常或调试事件的线程信息
~[Number]s  线程切换

a                                修改当前指令,输入修改的指令按Enter结束 
sa 00400000 L53000Wrong”     以ASCII码的形式从00400000处开始往后53000个字节搜索字符串“Wrongdb 400000       以二进制的方式显示内存地位为400000开始的内容 
dd 400000DWORD类型查看 
d               按上一次的d命令的方式来显示,如果不带参数,则从上一次显示结束的地方继续显示 
?i              查看局部变量i的值,会以10进制和16进制同时显示 
eb 0012ff78 'a' 'b'      从内存地址0012ff78开始依次写入后面的值 
r                        用于查看或者修改寄存器或伪寄存器 
r $peb                   $peb是一个伪寄存器,调试器将它定义为当前进程的进程环境块地址 
dt                       用于查看结构体内容 
!address 400000          查看指定内存地址的信息 
dv                       查看当前作用域下局部变量的类型和值

.ecxr                    当前异常的上下文信息
!analyze -v              详细显示当前异常信息,常用于分析dmp文件

|             所有进程列表
|.            当前进程信息
|#            导致当前异常或调试事件的进程信息
|[Number]s    进程切换
!peb          进程环境块

!locks              查看进程中有些锁处于锁定状态
!cs -l              查看处于锁定状态的关键区
!handle 000000c0 f  查看句柄000000c0的信息

七、常用调试方法

7.1、附加进程调试

使用File菜单中的Attach to a Process选项来选择要附加调试的进程.

7.2、启动调试新进程

  1. 使用菜单File-> Open Executable选项来选择要启动调试的进程。
  2. 启动windbg时将待调试的程序的文件路径作为参数传递给windbg。
  3. 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options下新建一个以程序名命名的子项,然后在这个子项中新建一个名为DebuggerREG_SZ类型的值,将值设置为windbg的全路径,比如C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe。这样,再运行待调试的程序时,操作系统就会先启动windbg,并把要调试程序的路径传递给他。

7.3、调试转储文件

使用File菜单中的Open Crash Dump选项来加载dump文件。

7.4、远程调试

服务器(被调试程序的机器)和客户端(发出远程请求的机器)都应该安装版本相同的windbg,应该有网络连接或者串行口连接。

  • 以tcp端口方式:
    以命令行的方式启动服务器中的windbg,如:windbg.exe -server tcp:port=5005
    以命令行的方式启动客户端中的windbg,如:windbg.exe -remote tcp:port=5005,server=192.168.1.180

  • 以管道方式:
    以命令行的方式启动服务器中的windbg,如:windbg -server npipe:pipe=advdbg (adbdbg为命名管道名称)。
    在客户端中以命令行的方式启动windbg,如:windbg -remote npipe:server=REMOTEHOSTNAME,pipe=advdbg (REMOTEHOSTNAME为远程主机名,dbvdbg为远程主机创建的命名管道名,也可以选择File菜单中的Connect to Remote Session,在弹出来的编辑框中输入远程参数npipe:server=REMOTEHOSTNAME,pipe=advdbg)

成功连接后,命令行信息区会显示类似如下信息:
…(npipe advdbg) connected at Thu Jul 11 14:22:02 2017
之后可以在客户端或者服务器的windbg中执行各种调试命令,执行结果会同时显示在两个调试器中。

其它的远程调试方案,可以参考:
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/remode-debugging-using-windbg

如何使用windbg生成dmp文件可以参考:如何生成转储(dmp)文件–工具篇

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

china_jeffery

你的鼓励是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值