#重要说明

(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. pip install使用豆瓣源

    这个是老问题了 pip install -i https://pypi.douban.com/simple/ selenium 类似的,npm和gem安装的时候可以使用淘宝源.

  2. ECSHOP会员登录后直接进用户中心

    ECSHOP系统在会员登录成功后,不是直接进入用户中心,而是跳转回了上一个页面或者是跳转到了首页. 注意:这里说的是,用户没有主动点击前往哪个页面,让系统自动跳转. 那如何让会员登录成功后自动进入“用 ...

  3. 【C#】取得并改变图像解析度

    , , bmpOrg.Width, bmpOrg.Height);       g.Dispose();       // 画像を保存       string dirName = Path.GetD ...

  4. C# 接口的隐式与显示实现

    隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...

  5. android 抓包 使用 tcpdmp + Wireshark

         下载地址tcpdump: http://www.androidtcpdump.com/      使用su用户, 给/system/可写的权限 mount -o remount,rw -t ...

  6. JQuery 表格拖动调整列宽效果

    类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整.最近比较空闲,便自己动 ...

  7. spark MySQL jar 包

    /** * Created by songcl on 2016/6/24. */ import java.sql.DriverManager //val sqlContext = new org.ap ...

  8. Python--类-例子

    class Base: def __init__(self): self.data = [] def add(self, x): self.data.append(x) def addtwice(se ...

  9. C++ string 用法详解

    /////////////////////////////////////////////////////////////////////////////////// 任何人对本文进行引用都要标明作者 ...

  10. [Android Studio 权威教程]断点调试和高级调试

    好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...