#重要说明

(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来终止一个长时间未完成的命令

(7)通配符 *代表0或任意多个字符,?代表任一个单一字符,#代表它前面的字符可以出现任意次,比如lo#p表示所有以l来开始p结束,中间有任意多个o的所有符号,比如lop,loop,looop... 如果中间允许多个字符重复,使用方括号,例如用 m[ai]#n 可以通配 man, min, maan,main,maiain等

#启动调试

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帮助文件

.hh bp  // 打开windbg的chm帮助文件bp命令介绍页

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"// 为指定模块加载符号信息

!sym noisy //开启加载符号的“吵杂”模式

.reload /i dbgee.exe //加载不完全匹配的符号文件 dbgee.exe的符号文件

.chain  // 显示已经加载进来的模块

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

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

lm vm ker* // v 列出模块的详细信息 m为过滤模块 ker*通配符 ker开头的所有模块

!lmi  // 列出一个模块的详细信息

ln 8053ca11 // 用来搜索距离指定地址8053ca11最近的符号

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

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

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

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

u  // 反编译

u .u $ip       //两个命令是效果是一样的, 反汇编当前$ip地址上的8条命令.

uf .

uf $ip      //两个命令的效果是一样的, 反汇编当前$ip地址上的整个函数.

uf AllcStk!WinMain //反汇编AllcStk模块中的完整的WinMain函数。

ub .

ub $ip         //两个命令的效果是一样的反汇编$ip之前的8条指令.

ub $ip L2a  //反汇编$ip地址之前的42条指令.

u $ip $ip+a //反汇编地址$ip到地址$ip+10之间的指令. 注意, 这里包括$ip, 不包括$ip+10。

#进程与线程

|   // 列出调试进程

|*  // 列出调试进程

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

|Ns // 切换序数为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的线程

.thread  //显示或设置寄存器上下文所针对的线程. 得到当前线程的_ETHREAD 第一个结构是Tcb是_KTHREAD 从而得到该线程的内核栈地址 然后可用 dt nt!_KTHREAD "线程地址" 来查看

#断点

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 TestCommon! CTest::add  // 在TestCommon.dll的Test.cpp文件的CTest::add()函数起始处放置一个断点

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

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

bu  // 保存断点,其用法和bp一样 设置一个延迟的以后再落实的断点,用于对尚未加载的模块中的代码设置断点,当指定的模块被加载时,WinDBG会真正的落实这个断点。

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的类型与值

dt -v -r _eprocess //r显示成员中是子结构成员 v显示详细信息

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

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

dd /c1 esp //以一列显示堆栈信息

#dump输出

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

#其他元命令

.tlist  // 显示所有进程

.cls  // 清除屏幕

.logopen /t c:\logs\mylogfile.txt  // 执行结果输出到Log文件

#其他扩展命令

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

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

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

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

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

#帮助

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

windbg调试命令相关推荐

  1. Windbg调试命令详解

    Windbg调试命令详解 发表于2013 年 8 月 23 日 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Win ...

  2. 博客摘录「 Windbg调试命令汇总」2023年4月15日

    目录 1.Windbg调试器介绍 2.Windbg版本说明 3.Windbg命令汇总 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...) https://blog.csdn.net/c ...

  3. Windbg调试命令详解(3)

    3 进程与线程 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1 进程命令 进程命令包括这些内容:显示进程 ...

  4. 搬运! Windbg调试命令详解

    转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是 ...

  5. WinDBG 调试命令大全

    转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html  #调试命令窗口 ++++++++++++++++++++++++ ...

  6. windbg调试命令2(!gle、g、p)

    !gle 扩展显示当前线程的最后一个错误码. 这个太好记了,getlasterror取首字母: 0:002> !gle   LastErrorValue: (Win32) 0 (0) - < ...

  7. Windbg调试命令详解(2)

    转载注明>> [作者:张佩][原文:http://blog.csdn.net/blog_index] 2. 符号与源码 符号与源码是调试过程中的重要因素,它们使得枯燥生硬的调试内容更容易地 ...

  8. windbg调试命令汇总

    1:64位可以加载32为进行调试,!wow64exts.sw 切换到32位,再输一次切换到64位 2:x*! 查看哪些模块的符号文件已经被加载, F9:设置断点,只要在光标定位的位置(上图中灰色条)按 ...

  9. WinDbg 调试命令记录二 (基础CLR查看)

    查看CLR基础 !dumpdomain  //dump domain信息 !dumpdomain <domain assress>  //dump 某个 domain 的信息 !dumpa ...

最新文章

  1. 什么浏览器好用_手机浏览器不只UC,好用的浏览器还有这些
  2. Kaggle新上比赛-鲸鱼图像识别-总奖池17.4万人民币
  3. ASP.NET 控制页和内容页中的事件
  4. git(1)---git介绍
  5. IOCP 下行为投递的关键点
  6. DevOps、CI、CD是什么关系
  7. c语言谭浩强简介,大一C语言谭浩强总结(到数组)简介.ppt
  8. java path环境变量_java配置环境变量
  9. qq三国2015最新服务器,合服服务器查询
  10. How to Backdoor Federated Learning
  11. Python实用案例,Python脚本实现快速卡通化人物头像,让我想起了QQ秀时光!
  12. matlab使用记录--读取当前文件夹所有文件、找到最新创建的文件、app designer打开文件选择窗口
  13. MOSES的高级特征和功能
  14. mysql 的 3306、33060 端口区别
  15. 053试题 334/682 - crosscheck
  16. Vue-2-计算属性、侦听器、过滤器、样式绑定
  17. 【算法基础四】C语言小项目实战---通讯录管理系统(单链表)
  18. HTML+CSS+JS实现鼠标点击特效富强民主文明方法
  19. UML 之 C++类图关系全面剖析
  20. 嵌入式开发(三):海思Hi3559a交叉编译live555

热门文章

  1. css实战笔记(一):写网页前的reset工作
  2. mongodb安装和配置
  3. JSONAssert Spring Boot Test
  4. div+css命名规范大全
  5. jQuery中attr和prop方法的区别
  6. tomcat7 内存溢出 java.lang.OutOfMemoryError: Java heap space
  7. CSS Sprites (CSS精灵)
  8. 部队人员官兵请假管理系统
  9. 教你学习快速排序算法-程序员必备哦
  10. 在 mingw32 上编译 libvpx 1.7.0 时的注意事项