#重要说明

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

#进程与线程

| // 列出调试进程

|* // 列出调试进程

|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的线程

#调用堆栈

k // 显示当前调用堆栈

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

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

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

.frame // 显示当前栈帧

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

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

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

#启动调试

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  // 反编译

#断点

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

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

#寄存器

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

整理自http://www.cnblogs.com/Clingingboy/archive/2013/03/26/2983166.html

windbg学习进阶之——dump分析常用命令收集的更多相关文章

  1. (转载)shell日志分析常用命令

    shell日志分析常用命令总结 时间:2016-03-09 15:55:29来源:网络 导读:shell日志分析的常用命令,用于日志分析的shell脚本,统计日志中百度蜘蛛的抓取量.抓取最多的页面.抓 ...

  2. redis学习-列表(list)常用命令

    redis学习-列表(list)常用命令   lpush:从列表左侧头部添加数据 rpush:从右侧尾部添加数据 lpop:从给左侧头部取出一个元素 rpop:从右侧尾部取出一个元素 lrange:取 ...

  3. linux基础学习之软件安装以及常用命令

    linux基础学习之软件安装以及常用命令 调用中央仓库: yum install wget 然后下载nodejs: wget https://nodejs.org/dist/v10.14.2/node ...

  4. Android学习第三天-打包常用命令

    在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...

  5. liunx学习笔记(一:常用命令)

    linux: 在学习linux之前我们应该多少了解windows的一些相关操作,linux也就是类似windows的另一种操作系统,用来管理软硬件的一种应用.在windows下你可以通过鼠标点击相关的 ...

  6. Android学习第三天-签名常用命令

    由于怕篇幅过长,所以把这个打包常用命令分开成两篇博文来进行讲解,下面我们直接进入主题吧. 8.keytool 这是我们JDK自带的密钥和证书管理工具 命令: -certreq 生成证书请求 -chan ...

  7. Redis学习笔记(三)常用命令整理

    Redis 常用命令 1.DEL key 删除key2.EXISTS key 检查key是否存在3.KEYS * 查看所有的key4.EXPIRE key seconds 设置key的过期时间5.TT ...

  8. Linux基础学习(4)--Linux常用命令

    第四章——Linux常用命令 一.文件处理命令 1.命令格式与目录处理命令ls: (1)命令格式:命令 [-选项] [参数]   例:ls -la /etc (2)说明:个别命令使用不遵循此格式;当有 ...

  9. 学习操作Mac OS 之 常用命令

    ~ 符号在 Mac 甚至所有基于 Unix 和 Linux 的系统中都是代表当前用户的用户目录,.代表当前目录 配置环境变量语句:  source ~/.bash_profile 查看host文件语句 ...

随机推荐

  1. Oracle 数据同步系列--触发器

    现在随着项目集成的越来越深入,异构的数据多起来,数据同步的场景也用的多起来,我甚至在考虑是否忽悠用户上Oracle GoldenGate了,这样就可以不用考虑采用哪种同步方案了. 简单的介绍一下我们数 ...

  2. ubuntu-15.10-server-i386.iso 安装 Oracle 11gR2 数据库

    注意: ld的版本为 2.25.1,gcc版本为gcc-5 特点: 需要重新安装老版本的 libaio1_0.3.109-2ubuntu?_i386.deb.默认的libaio库有问题,和其默认lib ...

  3. saiku执行速度慢

    使用saiku的过程中发现一个重要问题,速度慢!下面是跟踪和优化过程 一.首先抓包,发现ajax请求:http://l-tdata2.tkt.cn6.qunar.com:8080/saiku/rest ...

  4. 正则表达式工具RegexBuddy使用教程(原创自Zjmainstay)

    从<我眼里的正则表达式(入门)>这个文章,到<深入正则表达式应用>,再到后来专门创建的正则QQ群"专精正则表达式",到现在已经过去2年时间了.在文章和群里一 ...

  5. 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。

    #include <iostream> using namespace std; int maxCover(int* a, int n, int l) { ; ; ; while(end ...

  6. 网络安装archlinux(2012.8.20)笔记

    周末闲极无聊,把烂笔记本翻出来想装个Archlinux,发现USB不能启动,光驱也挂了,只好网络安装. 我先后试了两种安装方式,一种纯互联网启动,安装,一种局域网启动,再互联网安装.分别说说. 不管哪 ...

  7. JavaScript中的String对象

        String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex] ...

  8. NPM私有服务器架设 FOR CentOS

    确保计算机能够连接互连网. 一.安装 Couchdb1.6 1.(CentOS 6.7)如果版本低于6.7请使用下面命令更新系统库. yum update 2.使用下面命令安装依赖库 yum inst ...

  9. JavaScript高级之词法作用域和作用域链

    主要内容: 分析JavaScript的词法作用域的含义 解析变量的作用域链 变量名提升时什么 一.关于块级作用域         说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. ...

  10. 如何修改Windows Azure Web App的时区

    Windows Azure的时区默认使用UTC,如果是VM可以直接修改,但Azure Web Apps的隔离性导致我们无法进行设置.应用系统使用DateTime.Now的地方很多,不可能做出一一修改. ...