WinDebug 常用命令表【摘】

本文详细介绍Windbg调试工具的基本命令、调试流程控制、符号加载、进程与线程管理等功能,帮助开发者快速掌握Windbg使用技巧。

#调试命令窗口

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#重要说明

(1) windbg命令分为标准命令,元命令和扩展命令。

     标准命令提供最基本的调试功能,不区分大小写。如:bp  g  dt  dv  k等

     元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath  .reload等

     扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等

(2) 进入调试状态时,直接回车可重复执行上一条命令;按上下方向键可以浏览和选择以前输入过的命令

(3) 神奇的Tab键,进行命令补全;ESC清除当前命令输入框中的文本

(4) 使用;作为分隔符,可以在同一行输入多条命令

(5) 上图红色框中的“0:000”。【0为当前调试会话的进程号;000为调试会话的线程号

(6) 当命令提示符显示*BUSY*时,即使命令输入框可以输入命令,但输入的命令不会立即被执行,要等windbg空闲时才能执行。

     可使用Ctrl + Break来终止一个长时间未完成的命令

#启动调试

windbg "notepad.exe" arguments // 使用windbg启动调试notepad.exe

windbg -p 4200 // 将windbg附加到一个正在运行的pid为4200的进程上

windbg -pn "notepad.exe" // 将windbg附加到一个正在运行的名为notepad.exe的进程上

windbg –z "c:\mydumpfile.dmp" // 调试mydumpfile.dmp文件

.attach 0n4220 // 4220为十进制pid,使用该命令附加调试时,必须先存在一个调试会话

.detach // 分离调试

.restart // 重启并调试

.kill // 强制结束当前调试

q // 退出windbg

#获取帮助

? // 打印出所有标准命令

.help // 打印出所有元命令

.hh // 打开windbg的chm帮助文件

command /? // 打印命令command具体参数用法

#注释符

* // 注释整行

$$ // 注释(遇到分号结束)

#配置调试环境

.sympath // 查看当前符号查找路径

.sympath c:\symbols // 将符号查找路径设为:c:\symbols

.sympath+ c:\symbols // 将c:\symbols添加到符号查找路径集合中

.symfix // 将符号查找路径设为:SRV*WinDbg安装目录\Sym*http://msdl.microsoft.com/download/symbols

.symfix f:\symbols // 将符号查找路径设为:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols

.symfix+ f:\symbols // 将SRV*f:\symbols*http://msdl.microsoft.com/download/symbols添加到符号查找路径集合中

.srcpath // 查看当前源文件查找路径

.srcpath f:\src // 将源文件查找路径设为:f:\src

.srcpath+ f:\src // 将f:\src添加到源文件查找路径集合中

.exepath // 查看可执行文件查找路径

.exepath f:\bin // 将可执行文件查找路径设为:f:\bin

.exepath+ f:\bin // 将f:\bin添加到可执行文件查找路径集合中

#符号加载与查看

除了使用ld和.reload命令直接加载符号文件,某些使用符号的命令也可以触发调试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

值得说明的是,windbg缺省使用的是懒惰式符号加载策略,当它收到模块加载事件时,它通常是不会加载符号的,符号状态显示为deferred(延迟加载)。

.symopt // 显示当前所有符号选项

.symopt+ flags // 添加符号选项

.symopt- flags // 删除符号选项

ld * // 为所有模块加载符号

ld kernel32 // 加载kernel32.dll的符号

.reload // 为所有模块加载符号信息

.reload /f /v // f:强制立即模式  v:详细模式

.reload /f @"c:\windows\System32\verifier.dll" // 为指定模块加载符号信息

x *! // 列出所有模块对应的符号信息

lm // 列出所有模块对应的符号信息

x ConsoleTest!* // 列出ConsoleTest模块中的所有符号

x ConsoleTest!add* // 列出ConsoleTest模块中的所有add开头的符号

x /t /v ConsoleTest!* // 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号

x kernel32!*LoadLib* // 列出kernel32模块中所有含LoadLib字样的符号

u  // 反编译

#进程与线程

| // 列出调试进程

|* // 列出调试进程

|N // 参看序数为N的调试进程

|Ns // 切换序数为N的进程为当前调试进程

~ // 列出线程

~* // 所有线程

~* k // 所有线程堆栈信息

~* r // 所有线程寄存器信息

~. // 查看当前线程

~# // 查看导致当前事件或异常的线程

~N // 查看序数为N的线程

~~[n] // 查看线程ID为n的线程

~Ns // 切换序数为N的线程为当前调试线程

~N f // 冻结序数为N的线程

~N u // 解冻序数为N的线程

~N n // Suspend序数为N的线程

~N m // Resume序数为N的线程

#断点

bl // 列出所有断点

bc * // 清除所有断点

bc 1 // 清除1号断点

bc 1 2 5 // 清除1号、2号、5号断点

be *  // 启用所有断点

be 1 // 启用1号断点

be 1 2 5 // 启用1号、2号、5号断点

bd * // 禁用所有断点

bd 1 // 禁用1号断点

bd 1 2 5 // 禁用1号、2号、5号断点

bp 7c801b00 // 在7c801b00地址处放置一个断点

bp `ConsoleTest.cpp:36` // 在ConsoleTest.cpp的36行处放置一个断点

bp main // 在main函数的起始处放置一个断点

bp CSecondLoader::CSecondLoader // 在CSecondLoader的构造函数处放置一个断点

bp `ConsoleTest.cpp:40` "j (poi(MyVar)>5) ''; 'g'" // 条件断点 MyVar>5,执行空语句(;),断住  否则继续执行

bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'" // 条件断点 寄存器eax的值为0xa3时断住

bu // 保存断点,其用法和bp一样

bm add_* // 匹配add_开头的函数,并在这些函数起始处都打上断点

ba w4 0483dfe0 // 当对0483dfe0地址写操作时停下

// ba [r|w|e] [Size] Addr      [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]

#调试执行控制

g // Go(F5)

gH // 执行gH命令强制让调试器返回已经处理了这个异常。【Go with Exception Handled】

// 系统收到这个回复后会停止分发异常(因为调试器声称已经处理了异常),恢复调试目标继续执行,

     //  但由于异常条件仍在,所以还会产生异常,于是再次分发,WinDBG再次中断到命令模式。

gN // 【Go with Exception Not Handled】

     // 执行gN命令强制让调试器返回没有处理了这个异常,那么系统会进一步分发该异常,

// 如果没有其他调试器也不处理,最后系统会弹出程序终止对话框。

gu // 执行到当前函数完成时停下 【Go Up】

p   // 单步执行(F10)  【Step】

p 2 // 2为步进数目

pc // 执行到下一个函数调用处停下 【Step to  Next Call】

pa 7c801b0b // 执行到7c801b0b地址处停下  【Step to Adress】

t // Step into(F11) 【Trace】

tc // 执行到下一个进入点处停下 【Trace to Next Call】

ta 7c801b12 // 执行到7c801b12地址处停下 【Trace to Adress】

# 查看变量

dt nRet // 查看变量nRet的类型与值

dv // 显示当前函数内所有局部变量,函数参数

dv n* // 显示当前函数内n开头的所有局部变量,函数参数

dv /t /i /V /a|/n|/z

/*****************************************

更加详细地显示当前函数内所有局部变量,函数参数信息 
i = type (local, global, parameter) 
t = data type 
V = memory address or register location 
----------------------- 
a = sort by Addr, n = sort by name, z = sort by size

*****************************************/

#调用堆栈

k // 显示当前调用堆栈

kn // 带栈编号显示当前调用堆栈

kb // 打印出前3个函数参数的当前调用堆栈

kb 5 // 只显示最上的5层调用堆栈

.frame // 显示当前栈帧

.frame n // 设置编号n的栈帧为当前栈帧

.frame /r n // 设置编号n的栈帧为当前栈帧 并显示寄存器变量

!uniqstack // 显示所有线程的调用堆栈

#寄存器

r // 显示所有寄存器信息

r eax, edx // 显示eax,edx寄存器信息

r eax=5, edx=6 // 对寄存器eax赋值为5,edx赋值为6

#内存

da /c 5 7c801e02 // 从7c801e02内存处开始,显示5个ascii字符

/*****************************************

d[a| u| b| w| W| d| c| q| f| D] [/c 列数] [地址]

a = ascii chars 
u = Unicode chars 
b = byte + ascii 
w = word (2b) 
W = word (2b) + ascii 
d = dword (4b) 
c = dword (4b) + ascii 
q = qword (8b) 
f = floating point (single precision - 4b) 
D = floating point (double precision - 8b)

*****************************************/

dyb /c 3 7c801e02 // 从7c801e02内存处开始,显示3个byte及二进制

/*****************************************

dy[b | d] ..   // b = binary+byte     d = binary+dword

*****************************************/

#dump输出

.dump /ma "d:\mydmpfile.dmp" // 将当前调试进程输出Dump文件

#其他元命令

.tlist  // 显示所有进程

.cls // 清除屏幕

#其他扩展命令

!analyze -v // 详细显示当前异常信息

!peb // 格式化输出PEB信息(process's environment block)

!gle  // 打印当前线程最近的错误信息

!gle -all  // 打印所有线程的最近的错误信息

!error  897// 显示错误码为897的详细描述信息

#帮助

中文在线帮助:http://www.dbgtech.net/windbghelp/index.html

windbg cmd: http://www.slideshare.net/kewuc/windbg-cmds 【下载


启动, 附加进程, 执行和退出(Starting, Attaching, Executing and Exiting)

=======================

 

Start -> All Programs -> Debugging Tools for Windows -> WinDBG

启动

F6

attach to process

附加到进程

Ctrl-Break

interrupt debugee

中断正在被debug的程序

.detach

detach from a process

脱离进程

g

continue debugee execution

继续执行被debug的程序

q

exit WinDBG

退出WinDBG

 

获得帮助(Getting Help)

=======================

?

help on commands that affect the debugee

列出所有的内置命令和操作符

.help

help on commands that affect the debugger

列出所有的元命令

.hh command

view the on line help file

打开WinDBG的帮助文件

!help

help on the extension dll at the top of the chain (e. g., SOS)

列出扩展DLL中的扩展命令帮助

 

操纵命令(Issuing Commands)

=======================

up arrow, down arrow, enter

scroll through command history

浏览命令历史

Right mouse button

paste into command window

在命令窗口中粘贴

 

检查非托管环境(Examining the Unmanaged Environment)

=======================

lmf

list loaded modules with full path

列出已加载了的模块及其完整路径

lmt

list loaded modules with last modified timestamp

列出已加载了的模块和最后修改的时间戳

~

list unmanaged threads

列出所有非托管线程

~thread s

select a thread for thread specific commands

 

!token -n

view thread permissions

 

k

view the unmanaged call stack

查看非托管调用栈

!runaway

view thread CPU consumption

显示每个线程占用的时间

bp

set a breakpoint

设置一个断点

.dump path

dump small memory image

创建一个小的dump内存镜像

.dump /ma path

dump complete memory image

创建一个完整的dump文件

 

使用Debuger DLL扩展(Working with Extension DLLs (e. g., SOS))

=======================

.chain

list extensions dlls

列出所有加载了的debugger extension

.load clr10\sos

load SOS for debugging framework 1.0 / 1.1

加载.net 1.1托管程序的debug扩展

.unload clr10\sos

unload SOS

卸载SOS

.loadby sos mscorwks

load SOS for debugging framework 2.0

加载.net 2.0的debug 扩展

 

SOS命令(SOS Commands)

=======================

!threads

view managed threads

查看所有托管线程

!clrstack

view the managed call stack

查看托管调用栈

!dumpstack

view combined unmanaged & managed call stack

查看非托管和托管结合的调用栈

!clrstack -p

view function call arguments

查看托管函数调用的参数

!clrstack –l

view stack (local) variables

查看托管栈的局部变量

!name2ee module class

view addresses associated with a class or method

查看某个类或方法的内存地址

!dumpmt –mdaddress

view the method table & methods for a class

查看指定地址的方法表和一个类的方法集

!dumpmd address

view detailed information about a method

显示指定地址的MethodDesc结构信息

!do address

view information about an object

显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size

!dumpheap –stat

view memory consumption by type

显示堆内存的使用

!dumpheap –min size

view memory consumption by object when at least size

查看堆内存使用, 忽略小于size字节大小的对象

!dumpheap –typetype

view memory consumption for all objects of type type

查看所有类型为type的对象的内存使用

!gcroot address

view which object are holding a reference to address

查看所有对指定地址的对象的引用

!syncblk

view information about managed locks

查看托管的锁(SyncBlock结构)

 

SOS 2.0 命令(SOS 2.0 Commands)

========================

!bpmd module method

set breakpoint

在指定模块的某一指定的方法上设置断点

!DumpArray address

view contents of an array

查看数组中的元素

!PrintException

view information about most recent exception

格式化地显示最近的异常信息

 

 


WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户 态调试、 内核态调试、 调试转储文件、 远程调试等等。 WinDBG 具有非常大的灵活性和可扩展性, 用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块 来定制和补充 WinDBG 的调试功能。 尽管 WinDBG 是个典型的窗口程序, 但是它的大多数调试功能还是以手工输入命令的方式来 工作的。目前版本的 WinDBG 共提供了 20 多条标准命令, 140 多条元命令( Meta-commands), 和难以计数的大量扩展命令。学习和灵活使用这些命令是学习 WinDBG 的关键,也是难点。 上一章我们从设计的角度分析了 WinDBG ,本章将从使用(用户)的角度介绍 WinDBG 。我 们先介绍工作空间的概念和用法(第 1 节),然后介绍命令的分类和不同种类的命令提示符(第 2 节)。 第 3 节介绍不同的调试模式, 也就是如何与不同特征的调试目标建立调试会话。 第 4 节介绍 上下文的概念和在调试时应该如何切换和控制上下文。第 5 节介绍调试事件和如何定制调试事件 的处理方式。 从第 6 节到第 9 节我们将分别介绍如何在 WinDBG 中完成典型的调试操作, 比如控 制调试目标(第 6 节)、设置断点(第 7 节)、观察栈(第 8 节)以及如何观察和修改数据(第 9 节)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值