windbg调节和测试命令,dump分析常用命令收集

 #调节命令窗口

#关键表明

windbg中的调节和测试指令有三种:
 http://www.360doc.com/content/16/1110/14/30953065\_605412205.shtml

图片 1

(1) windbg命令分为专业命令,元命令和扩展命令

  1. 主旨命令: 调试器自带,提供最基本的调节和测试功效,不区分轻重缓急写。 例如 bp
    ,g  ,dt ,dv ,k,s等

  2. 元命令:调节和测试器自带,以“.”起始. 提供基本命令没有提供的功效。例如
    .reload  .sympath等

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

     专业命令提供最中央的调剂成效,不区分轻重缓急写。如:bp  g  dt  dv 
k等

3.
扩张命令:外部参与的吩咐,以“!”起首。用于扩充某一方面包车型大巴调剂功效,其完毕在动态加载的模块中。例如:!analyze

#使用gflags.exe工具(在windbg所在目录下),让某些进度运行时,拉取windbg进行调剂

    
元命令提供正规命令没有提供的意义,也内建在调试引擎中,以.初始。如.sympath 
.reload等

应用;分隔符,能够在一行输入多个指令。使用 ctrl + break
能够告一段落叁个发令。当输入框显示为busy时,固然输入框能够输入指令,输入的指令也不会及时实施。

正如截图:当名称为captcomm.exe的历程运转时,拉起windbg调节和测试

    
增添命令用来扩大某一方面的调节功用,实现在动态加载的扩大模块中,以!开头。如!analyze等

一. windbg 运维调节和测试的方法

图片 2

(2)
进入调节和测试意况时,直接回车可再度执行上一条命令;按上下方向键能够浏览和甄选在此在此以前输入过的吩咐

分成二种:

也可经过脚本命令来兑现:

(3) 神奇的Tab键,进行指令补全;ESC免去当前下令输入框中的文本

  1. 命令市价势运营:(又分为打开和叠加三种办法)
// 运行captcomm.exe时,启动windbg调试
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f
// 解除启动时windbg调试
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f

// 64位系统上,也可以设置以下注册表节点
reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f
// 解除启动时windbg调试
reg delete "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f

// 测试发现:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options和HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options指向的是同一数据,修改其中任何一个都可以

(4) 使用;作为分隔符,能够在相同行输入多条命令

windbg  – i        // 将windbg设置为暗中认可调节和测试器

安全软件大概会禁止修改注册表的Image File Execution项:

(5)
上海教室白灰框中的“0:000”。【0为日前调节和测试会话的进度号;000为调节和测试会话的线程号

windbg “notepad”  arguments   //使用windbg 运维notepad调节和测试,设置运转参数

— 对于360安全警卫,在“设置”中去掉“开启360本身保障”的勾选来关闭

(6)
当命令提醒符突显*BUSY*时,固然命令输入框能够输入指令,但输入的指令不会及时被实践,要等windbg空闲时才能执行。

windbg -p  4200    //使用windbg 附加到四个正在运作的PID = 4200的进度

图片 3

     可选择Ctrl + Break来终止1个长日子未成功的授命

windbg -pn “notepad”
 //使用windbg附加到1个正值运转的名字为”notepad”的长河

— 对于McAfee,必要禁止IPS(Intrusion Prevension Systems)。

 

  1. 图形界面形式:直接运维windbg.exe

— 可是,电脑管家,则不会对该键值的注册表修改举办拦阻。

 

二. 常用的元命令

 

#进度与线程

  1.   .restart      //重启并调节和测试

#驷不比舌表明

| // 列出调节和测试进程

2   .kill             //强制甘休目前调节和测试

(1) windbg命令分为标准命令,元命令和壮大命令。

|* // 列出调节和测试过程

  1.  .help          //打字与印刷出全数元命令

  2.   .hh            //打开windbg  chm扶助文书档案

标准命令提供最中央的调剂效能,不区分轻重缓急写。如:bp g dt dv k等
元命令提供规范命令没有提供的意义,也内建在调节引擎中,以.开头。如.sympath
.reload等
扩大命令用于扩充某一方面包车型地铁调节和测试成效,达成在动态加载的恢宏模块中,以!开头。如!analyze等

|N // 参看序数为N的调节和测试进度

三. 常用基本命令

(2) 进入调节和测试情形时,直接回车可重复执行上一条命令;按上下方向键能够浏览和抉择此前输入过的指令

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

  1.  搜索命令

(3) 神奇的Tab键,实行指令补全;ESC破除当前下令输入框中的文件

~ // 列出线程

       s -a 0012ff40 L0x20 “Hello”     //搜索ansi字符串“hello”,
从0012ff肆10位置开始, 长度是 0x20的界定。即搜索范围是 0012ff40~
0012ff60.

(4) 采用Command窗口中的内容,然后右击拓展复制

~* // 全数线程

 2.  断点命令

(5) 使用;作为分隔符,能够在一如既往行输入多条命令

~* k // 全数线程堆栈信息

      bp 0040108c             //直接在地点下断

(6) 上图灰褐框中的“0:000”。【0为当下调节和测试会话的长河号;000为调节和测试会话的线程号

~* r // 全数线程寄存器音信

      bp test1!马克斯  ; bp  马克斯          //直接在函数名上下断

(7) 当命令提示符呈现*BUSY*时,即便命令输入框可以输入指令,但输入的命令不会马上被实施,要等windbg空闲时才能履行。

~. // 查看当前线程

      bp  ‘test1.cpp:30’                        
//在test1.cpp第30行下断

     可利用Ctrl +
Break来终止3个长日子未到位的下令

~# // 查看导致当前事变或尤其的线程

      bp  CObject::CObject           //在CObject构造函数上下断

(8) 贰遍可以实施多条命令,命令间用分号;分隔 【如:bp main;bp
`view.cpp:120`】,一次打2个断点

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

     bp   kernel32!CreateFileA    
 //在kernel32.dll模块CreateFileA函数头地方下断

(9)按Ctrl + Alt + V开启/关闭verbose
Output(详细输出形式)

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

     bp  TestCommand!CObject::add  
//在TestCommand.dll模块的CObject类函数add底部下断。

(10)
为了确认保证windbg流畅运营,在调节和测试时,尽量不要开启Watch、Locals、Registers、Call
Stack、Processes and Threads窗口,直接用command来获撤消息

~Ns // 切换序数为N的线程为近期调节和测试线程

     bp `ConsoleTest.cpp:40` “.if (poi(pVar)>5) {};{g}”

#开发银行调节和测试

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

      // “.if (Condition) {Optional Commands}; {g}”    条件断点
pVar指针指向的值>5,执行空语句(;),断住  不然继续执行

windbg -I  // 将windbg设置成暗中同意调节和测试器

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

      bu  test1!马克斯  ;bu  马克斯          //在函数的开头下断

windbg “notepad.exe” arguments
 // 使用windbg运维调节和测试notepad.exe

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

      bm add_*                    
// 匹配add_始发的函数,并在那一个函数初叶处都打上断点

windbg -p 4200  //
将windbg附加到三个正在运行的pid为4200的经过上

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

     ba w4
0x0483dfe0// 当对0483dfe0地址写操作时停下,前面要带上0x,不然会报错。

windbg -pn “notepad.exe”  // 将windbg附加到三个正值周转的名为notepad.exe的进度上

#调用堆栈

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

windbg -p
4200 -c “sxd av;sxi c0000005;sxi c0000008;g” //
将windbg附加到2个正在运作的pid为4200的经过上,附加成功后,执行sxd
av;sxi c0000005;sxi c0000008;g命令

k // 彰显当前调用堆栈

           //这几个命令比较强硬,能够下内部存款和储蓄器访问,写入以及实施断点。
 内部存储器大徐熙娣(英文名:Elephant Dee)ize :单字节, 双字节,4字节,8字节。

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

kn // 带栈编号展现当前调用堆栈

 3. 断点管理

.opendump “c:\mydumpfile.dmp”  //
调试mydumpfile.dmp文件

kb // 打印出前二个函数参数的脚下调用堆栈

bl       // 列出全部断点     breakpoint  list

windbg -y d:\mySymbols // 指示symbol路径

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

bc *     // 清除全部断点    breakpoint  clear

windbg -srcpath d:\Src  // 提醒源文件路径

.frame // 展现当前栈帧

bc 1     // 清除1号断点

windbg -i  d:\myApp  //提示exe、dll等可实施模块路径

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

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

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

.frame /r n // 设置编号n的栈帧为方今栈帧 并出示寄存器变量

be *       // 启用全数断点   breakpoint   enable

.detach   // 分离调节和测试

!uniqstack // 展现全体线程的调用堆栈

be 1      // 启用1号断点

.restart  // 重启并调节

 

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

.kill  // 强制结束近来调节和测试

#起步调节和测试

bd *      // 禁止使用全体断点   breakpoint  disable**

q  //
甘休最近调节和测试会话,回到基础工作空间,并终止调节和测试进度

windbg “notepad.exe” arguments // 使用windbg运维调节和测试notepad.exe

bd 1     // 禁用1号断点

qd
 // 结束近来调节和测试会话,回到基础工作空间,但不收场调节和测试进程

windbg -p 4200 // 将windbg附加到多少个正在运作的pid为4200的进度上

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

CT汉兰达L+ALT+V  // 打开或关闭 Verbose
格局开关,某个命令在此形式下得以交到越多详细消息

windbg -pn “notepad.exe” //
将windbg附加到三个正值周转的名为notepad.exe的长河上

  1. 断点执行

.time
// 调节和测试会话时间新闻

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

g       // Go(F5)

.lastevent
 // 突显最新的丰硕消息或事件新闻

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

gu     // 执行到方今函数落成时停下【Go Up】

version
 // 展现windbg和已加载的调试器扩张相关的消息

.detach // 分离调节和测试

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

vercommand  //
展现windbg的启航行路线径及命令行音讯

.restart // 重启并调试

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

.chain  //
突显已经加载进来的调节和测试器扩展

.kill // 强制截至最近调节和测试

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

.extmatch /D
/e wow64exts *  // 呈现wow64exts调节和测试器扩张中的命令

q // 退出windbg

 t        // Step into(F11) 【Trace】

#收获扶助

#得到帮忙

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

?   // 打字与印刷出富有标准命令

? // 打字与印刷出全体正规命令

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

.help  // 打字与印刷出具有元命令

.help // 打字与印刷出装有元命令

  1.  进度有关

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

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

|         // 列出调节和测试进程

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

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

|*        // 列出调节和测试进度

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

#注释符

  1.  线程相关

#注释符

* // 注释整行

~       // 列出线程

*  // 注释整行

$$ // 注释(遭受分号甘休)

~*       // 全部线程

$$ // 注释(碰着分号甘休)

#布署调节和测试环境

~* k     // 全数线程堆栈新闻

#安顿调节和测试环境

.sympath // 查看当前标记查找路径

~* r    // 全部线程寄存器消息

注:倘若被调剂的模块(无论移动到本机的哪儿)是用本机代码编写翻译发生的,都不须求展开标记和源代码的途径设置

.sympath c:\symbols // 将标志查找路径设为:c:\symbols

~.       // 查看当前线程

.sympath   // 查看当前标记查找路径

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

~0s      // 查看主线程

.sympath c:\symbols   // 将标志查找路径设为:c:\symbols

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

~#      // 查看导致当前事件或特其他线程

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

.symfix f:\symbols //
将标志查找路径设为:SRAV4V*f:\symbols*http://msdl.microsoft.com/download/symbols

  1.  模块相关

.symfix //
将标志查找路径设为:S索罗德V*WinDbg安装目录\Sym*http://msdl.microsoft.com/download/symbols

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

lm     //列出进度加载模块 

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

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

  1. 查阅变量

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

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

dt     i_c        //查看变量地址, 类型, 值

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

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

dt ntdll!*      // 呈现ntdll里的持有类型消息

.srcpath f:\src // 将源文件查找路径设为:f:\src  
注:必须勾选上菜单“Debug”-“Source
Mode”;其它pdb须与exe、dll等施行模块匹配上

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

dt  *!*IMAGE_DOS*     //
呈现全体模块中含有IMAGE_DOS字符的类型新闻

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

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

dt myApp!g_app             //
表示展现myApp进度里全局变量g_app的内存布局

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

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

dt WindbgTest!CTest       // 查看模块WindbgTest的CTest的内部存款和储蓄器布局

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

#标记加载与查看

dt WindbgTest!CTest 0x0041f8d4          //
将0x0041f8d三地方处情节依照模块WindbgTest的CTest的内部存款和储蓄器布局来分析

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

除此而外选用ld和.reload命令直接加载符号文件,有些使用标志的吩咐也得以触发调节和测试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

 dt this                   // 查看this指针的花色及成员变量

图片 4

值得提明的是,windbg缺省采取的是懒惰式符号加载策略,当它接受模块加载事件时,它一般是不会加载符号的,符号状态显示为deferred(延迟加载)。

dt  -v   _PEB @$PEB           // 使用详细方式查看PEB(process’s
environment block)内部存款和储蓄器结构

 

.symopt // 展现当前全部符号选项

dt   tagMSG 0x0336e54c              //
类型要动用tagMSG,无法选择typedef发生出的MSG

#系统新闻

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

typedef  struct   tagMSG{

vertarget // os信息

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

HWND hwnd;

!cpuid  // cpu信息

ld * // 为具备模块加载符号

UINT message;

#wow64模式  【x64版windbg调试win32程序】

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

WPARAM wParam;

.load wow64exts  // [!load wow64exts] 加载wow64exts.dll模块
 注:!sw正是wow64exts中的命令

.reload // 为保有模块加载符号音讯

LPARAM lParam;

.unload wow64exts  // [!unload
wow64exts] 卸载wow64exts.dll模块

.reload /f /v // f:强制立时格局  v:详细方式

DWORD time;

.effmach  //
查看当前调节和测试mode:x8⑥ 、x64等

.reload /f @”c:\windows\System32\verifier.dll” //
为钦赐模块加载符号消息

POINT pt;

.effmach
x86 // 切换成x86栈环境  注:供给先执行.load
wow64exts来加载wow64exts.dll模块

x *! // 列出具有模块对应的记号消息

} MSG, *PMSG;

.effmach
. // 切换回x64

lm // 列出装有模块对应的号子音讯

dv               // 呈现当前函数内具备片段变量,函数参数的值   

!sw  // [!wow64exts.sw]
 在多少个mode:x8陆 、x64上拓展循环切换
 注:假如win32主次在x64的mode下,会看到地点是陆拾伍位的

x ConsoleTest!* // 列出ConsoleTest模块中的全数符号

dv  nCount    // 查看局地变量nCount的值

!k
 // [!wow64exts.k]  打印32位、64位堆栈

x ConsoleTest!add* // 列出ConsoleTest模块中的全数add初阶的号子

x              //突显当前函数内享有片段变量 ,函数参数的值,
包罗变量地址、**

!k 5
// [!wow64exts.k 5]  打字与印刷3四人、61位堆栈,栈帧个数为5

x /t /v ConsoleTest!* //
带数据类型、符号类型和尺寸音信,列出ConsoleTest模块中的全部符号

**x   nCount   // 查看局部变量nCount的值 和地点**

!info
// [!wow64exts.info]  输出wow64相关的PEB、TEB和TLS基本新闻

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


!r
// [!wow64exts.r]  输出处理器当前上下文音信

u  // 反编译


!r
dumpTest!main  // [!wow64exts.r dumpTest!main]
 输出main函数地址的上下文消息

#断点

  1.  查看堆栈

注 —
叁拾4个人windbg不大概打开61位应用程序,会唤起如下错误:

bl // 列出装有断点

k          // 显示当前调用堆栈

图片 5

bc * // 清除全数断点

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

注 —
三十二人windbg不可能attach上六十二人应用程序,会唤醒如下错误:

bc 1 // 清除1号断点

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

图片 6

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

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

 

be *  // 启用全数断点

kv             // 在kb的功底上加码了函数调用约定等音信

#标记加载与查看

be 1 // 启用1号断点

kp        
// 突显每一层函数调用的完好参数,包含参数类型、名字、取值(必须是总体符号的事态下,private
symbols);注意:若程序被优化,那几个值不自然对

除去采纳ld和.reload命令直接加载符号文件,某个使用标志的通令也能够接触调节和测试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

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

kd         // 打字与印刷堆栈的地方

值得一表达的是,windbg缺省级银行使的是懒惰式符号加载策略,当它接受模块加载事件时,它日常是不会加载符号的,符号状态呈现为deferred(延迟加载)。

bd * // 禁止使用全体断点

dds        //呈现栈帧

.symopt // 彰显当前拥有符号选项

bd 1 // 禁用1号断点

  1. 浮现行反革命汇编

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

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

u      //展现当前eip地方以往的8条指令

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

bp 7c801b00 // 在7c801b00地方处停放1个断点

uf CTest::add    // 反汇编CTest类的add函数

!sym noisy   // 激活详细标记加载(noisy symbol
loading)展现

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

uf /c main         //
反汇编main函数,通过/c能够查阅main函数中的函数调用(call)都有何

!sym quiet   // 禁止详细标记加载展现

bp main // 在main函数的初步处放置四个断点

ub 000c135d L20          // 查看地址为000c135d下令前的20条指令内容

ld * // 为全数模块加载符号

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

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

bp `ConsoleTest.cpp:40` “j (poi(MyVar)>5) ”; ‘g'” // 条件断点
MyVar>5,执行空语句(;),断住  不然继续执行

  1.  展现寄存器

.reload // 为具备已加载模块载入符号消息

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

r                // 展现全数寄存器消息及产生core所在的授命

.reload
/i // 重新加载不匹配符号的模块【dmp文件并未对号入座的pdb时选拔】

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

r eax, edx     // 展现eax,edx寄存器音讯

.reload /i
TGame.exe // 重新加载不匹配符号的TGame.exe

bm add_* // 匹配add_先导的函数,并在这个函数开始处都打上断点

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

.reload /f /v // f:强制立刻格局(区别意延迟载入)
 v:详细情势

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

.reload /f @”c:\windows\System32\verifier.dll”
// 为钦点模块加载符号音信

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

  1. 显示内部存款和储蓄器

.reload /f
TGame.exe // 为TGame.exe加载符号消息

#调节执行控制

!address       // 查看进程的兼具内部存款和储蓄器页属性

.reload /u
TGame.exe //
卸载TGame.exe及其载符号音讯

g // Go(F5)

!address 7ffd柒仟       // 查看7ffd8000地址处内部存款和储蓄器页属性

x *! // 列出富有模块对应的标记音信

gH // 执行gH命令强制让调节和测试器重返已经处理了那个丰盛。【Go with Exception
Handled】

dd /c 5 7c801e02      //
从7c801e02内部存储器处开首以dword为单位显示内部存款和储蓄器(宽度为:5)

lm // 列出具有模块(加载和未加载)对应的记号音讯

//
系统接到那个回复后会甘休分发至极(因为调节和测试器声称已经处理了特别),苏醒调节和测试目的继续执行,

dd /c 5 7c801e02 L8    //
从7c801e02内部存款和储蓄器处初步以dword为单位展现内部存款和储蓄器(宽度为:5)【展现七个dword】

lmv
// 列出装有模块(加载和未加载)对应的标志新闻

     // 
但由于这几个条件仍在,所以还会生出非凡,于是再一次分发,WinDBG再度中止到命令格局。

da /c 100 7c80ff03     //
从7c80ff03内存处发轫体现Ascii字符串(宽度为:100)

lmvm
ntdll  //
查看ntdll.dll的详细新闻(注意exe、dll等都毫不带后缀名)

gN // 【Go with Exception Not Handled】

du /c 100 7c8022f5     //
从7c8022f5内部存储器处开头显示Unicode字符串(宽度为:100)

!lmi
ntdll  //
查看ntdll.dll的详细音信(注意exe、dll等都毫不带后缀名)

     //
执行gN命令强制让调节和测试器再次来到没有处理了这么些足够,那么系统会愈来愈分发该特别,

s -w 522e0000 L0x100  0x1212 0x2212 0x1234    //
表示在开端地址522e0000以后的0x玖17个单位内搜索0x1212 0x2212
0x1234种类的原初地址

!dlls -l
 // 遵照加载顺序(暗许项)列出具有加载的模块

// 假诺没有其余调节和测试器也不处理,最终系统会弹出程序终止对话框。

s -u 522e0000 527d一千 “web”  
 //表示在522e0000 和527d一千里面搜索Unicode 字符串”web”

!dlls
-i  // 按早先化顺系列出全部加载的模块

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

ea 0x445634 “abc”    //
表示在0x445634地址写入Ascii字符串abc, 不分包截止符0

!dlls -v -c
ntdll
 // 查看ntdll.dll的详细消息(注意exe、dll等都毫不带后缀名)

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

eza 0x445634 “abc”    // 表示在0x445634个人置写入Ascii字符串abc,
包涵甘休符0

ln 0x65777588  //
查看地址0x65777588处或紧邻的号子音信

p 2 // 2为步进数目

eu 0x445634 “abc”   //
表示在0x445634地址写入Unicode字符串abc, 不带有停止符0

x ConsoleTest!* // 列出ConsoleTest模块中的全体符号

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

ezu 0x445634 “abc”    // 表示在0x445634地址写入Unicode字符串abc,
包涵截至符0

x ConsoleTest!add* // 列出ConsoleTest模块中的全数add开端的标志

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

ed nCounter 80      //
将变量nCounter的值修改为80(注:80为10进制还是16进制,仍然此外,取决于当前进制)

x /t /v ConsoleTest!* // 带数据类型、符号类型和分寸音讯,列出ConsoleTest模块中的全数符号

t // Step into(F11) 【Trace】

.writemem D:\Test\0041a5e4.bin 0041a5e4 L0x一千   //
将内部存款和储蓄器地址处0x0041a5e4前面0x一千尺寸的剧情拷贝存储到D:\Test\0041a5e4.bin中

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

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

13 查看堆

!itoldyouso
mono D:\mySymbols\mono.pdb  //
查看mono.dll与D:\mySymbols\mono.pdb符号是还是不是同盟上

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

!heap -s     //
显示进程堆的个数(每一项是3个堆,也正是_HEAP结构指针,对应的API是HeapCreate)

0:000> !itoldyouso mono
D:\mySymbols\mono.pdb

# 查看变量

dt _HEAP 001伍仟0   // 选拔一个堆的地址,打字与印刷该堆的内部存储器结构

mono.dll
Timestamp: 559AAA60
SizeOfImage: 230000
pdb:
C:\buildslave\mono-runtime-and-classlibs\build\builds\embedruntimes\win32\mono.pdb
pdb sig:
728334C1-72C3-4A51-B310-C44087FC4B2E
age: 1

dt nRet // 查看变量nRet的体系与值

!heap -a 00150000   //
选拔3个堆的地址,打字与印刷该堆的消息,比地点打字与印刷内部存款和储蓄器命令更详实直观

mono.pdb
pdb sig:
728334C1-72C3-4A51-B310-C44087FC4B2E
age: 1

dv // 展现当前函数内享有片段变量,函数参数

  1. 虚拟内部存款和储蓄器

MATCH: mono.pdb and mono.dll

dv n* // 展现当前函数内n开始的具备片段变量,函数参数

!vadump   // 查看虚拟内部存款和储蓄器布局


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

  1. 查看句柄

采纳windbg提供的symchk.exe工具来寻找模块的pdb

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

!handle   // 查看全部句柄的ID

symchk.exe Paladins.exe /v /s .\
 //在当前目录查找Paladins.exe的pdb,/s前面钦赐搜索路径
 带上/v会输出详细的log

更为详细地出示当前函数内有所片段变量,函数参数新闻
i = type (local, global, parameter)
t = data type

万一协作上,会彰显如下log:

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内部存储器处起始,显示多少个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内部存款和储蓄器处起首,显示叁个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

[SYMCHK] [ 0x00000000 - 0x001f0001 ] Checked "G:\TGame\symbols\ClientPackaging\Paladins.exe"

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

并未匹配上,则显示log为:

SYMCHK: Paladins.exe         FAILED  - ShippingPC-ChaosGameTencent.pdb mismatched or not found

SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0

 

#进程

|   // 列出调节和测试进程

|*  // 列出调节和测试进度

|N  // 参看序数为N的调节和测试进度

|Ns // 切换序数为N的进度为方今调节和测试进程

!dml_proc  // 展现当前经过消息 

#线程

~   // 列出线程

~*  // 全部线程

~* k // 全体线程堆栈消息

~* r // 所无线程寄存器音信

~.  // 查看当前线程

~0s
// 查看主线程

~# // 查看导致当前事件或尤其的线程

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

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

~Ns   // 切换序数为N的线程为当下调节和测试线程

~~[n]s  //
切换线程ID为n的线程为当前调节和测试线程  n为16进制

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

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

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

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

~* e
!gle // 展现全数线程最后的贰个错误音讯 e后能够为任意windbg命令

.ttime  // 查看当前线程时间新闻

!runaway
 //突显当前进度的富有线程用户态时间音讯

!runaway f  //展现当前进度的有着线程用户态、内核态、存活时间新闻

!locks // 显示死锁

!cs  // 列出CriticalSection(临界段)的详细音信

 

#断点

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地址处停放2个断点

bp MyDll+0x1032  //
在模块MyDll.dll偏移0x1032处停放三个断点

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

bp main // 在main函数的初步处放置三个断点

bp
@$exentry  // 在进程的入口放置2个断点

bp CSecondLoader::CSecondLoader
 // 在CSecondLoader的组织函数处放置一个断点

bp
TestCommon! CTest::add  //
在TestCommon.dll的Test.cpp文件的CTest::add()函数起头处放置3个断点

bp `ConsoleTest.cpp:40` “.if (poi(pVar)>5) {}; {g}” // “.if (Condition) {Optional
Commands}; {g}”    条件断点 pVar指针指向的值>5,执行空语句(;),断住  否则继续执行

bp `ConsoleTest.cpp:40` “j (poi(pVar)>5) ‘ ‘; ‘g'” // “j (Condition) ‘Optional Commands’; ‘g'”  
 j为条件表示式:条件断点 pVar指针指向的值>5,执行空语句(;),断住
 不然继续执行

注:Condition表明式语法默许的是MASM表明式语法。使用复杂C++表明式时大家要求用@@c++()将表明式包围住;如:”j @@c++(*pVar>5) ‘ ‘;
‘g'”


x表示的2个地点
hi(x) 高16 bits
low(x) 低16 bits
by(x) 重回第一个byte
wo(x) 再次来到第三个word
dwo(x) 重返第1个dword
qwo(x) 再次回到第3个4
word(Quad-word)
poi(x) 重返第②个指针所指向的值


bp `ConsoleTest.cpp:40` “j @eax = 0xa3
”; ‘g'” // j为准绳表示式:条件断点
寄存器eax的值为0xa3时断住

bp
kernel32!CreateFileA  //
在系统API的CreateFileA函数处放置四个断点

bp
kernel32!CreateFileA “.echo;.printf\”CreateFileA(%ma,%p,%p),
ret=\”,poi(esp+4),dwo(esp+8),dwo(esp+c);gu;.printf\”%N\”,eax;.echo;g”
// 不断住进度情状下,打字与印刷全体的CreateFileA调用

bp
kernel32!CreateFileW “.echo;.printf\”CreateFileW(%mu,%p,%p),
ret=\”,poi(esp+4),dwo(esp+8),dwo(esp+c);kn;g;”  //
不断住进度,打字与印刷全部的CreateFileW调用及仓库音讯

bp
advapi32!RegOpenKeyExA
“.echo;.printf\”RegOpenKeyExW(%p,\\\”%ma\\\”,%N,%N,%p) returned:
\”, dwo(esp+4), poi(esp+8), dwo(esp+c), dwo(esp+10),
dwo(esp+14);gu;.printf\”%N\”,eax;.echo;g”  //
不断住进度情形下,打印全部的RegOpenKeyExA调用(打开注册表键值)


注意:有个别函数Symbol
Name与导出函数名大概不一致,例如SetWindowPos,那时能够用Dependency查占卜应的导出函数地址(Entry
Point列):0x00018E5E,然后在windbg菜单“Debug”—〉“Modules…”对话框中收获user32.dll模块发轫地址0x77d一千0,在七个值相加后的相对化地址处直接设置断点:bp
77d28E5E;也得以透过x
user32!*一声令下列出任何Symbols列表,查找77d28E5E,找到SetWindowPos对应的Symbol
Name为“NtUserSetWindowPos”,然后通过标记设置断点:bp
user32!NtUserSetWindowPos。通过标志设置断点的便宜是当dll代码改变时,不必要修改,windbg会基于符号来自动匹配函数地址。


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

bm add_*  // 匹配add_始发的函数,并在那几个函数起首处都打上断点

ba w4 0x0483dfe0 // 当对0483dfe0地点写操作时停下,后边要带上0x,不然会报错

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

windbg无参脚本

//
当CreateFileW读取UnityLockfile文件时断住进度,在命令输入框输入:$$><d:\CreateFileWNoArguScript.txt,CreateFileWNoArguScript.txt内容如下:

bp kernel32!CreateFileW "
r $t1=poi(esp+4)
as /mu $FileName $t1
.echo
.printf\"File:%mu\",$t1
.echo
.block
{
.if($spat(\"${$FileName}\",\"*UnityLockfile\")) 
{
  .echo 'find...';
  ad ${/v:$FileName}
}
.else 
{
  .echo no find...
  ad ${/v:$FileName}
  gc
}
}"

windbg有参脚本

//
当CreateFileW读取mscorlib.dll文件时断住进度,在指令输入框输入:$$>a<d:\CreateFileWArguScript.txt
mscorlib.dll,CreateFileWArguScript.txt内容如下:

bp kernel32!CreateFileW "
r $t1=poi(esp+4)
as /mu $FileName $t1
.echo
.printf\"File:%mu\",$t1
.echo
.block
{
.if($spat(\"${$FileName}\",\"*${$arg1}\")) 
{
  .echo 'find...';
  ad ${/v:$FileName}
}
.else 
{
  .echo no find...
  ad ${/v:$FileName}
  gc
}
}"

 

#调节执行控制

g  // Go(F5)

gH // 执行gH命令强制让调节和测试器重回已经处理了这些相当。【Go with Exception Handled】

     //
系统接到这么些回复后会甘休分发十分(因为调节和测试器声称已经处理了非凡),复苏调节和测试指标继续执行,

     //
 但由于非凡条件仍在,所以还会产生十二分,于是再一次分发,WinDBG再次中止到命令格局。

gN // 【Go with
Exception Not Handled】

     //
执行gN命令强制让调节和测试器重回没有拍卖了这一个丰裕,那么系统会越来越分发该尤其,

     //
借使没有其余调节和测试器也不处理,最终系统会弹出程序终止对话框。

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

Ctrl+Break  // 暂停正在运营的先后

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

p 2 // 2为步进数目

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

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

t     // Step into(F11) 【Trace】

tc    // 执行到下三个进入点(Call指令)处停下 【Trace to Next Call】

tb
 //
执行到支行指令停下【分支指令包罗calls、returns、jumps、loops】

ta 7c801b12  // 执行到7c801b10个人置处停下 【Trace to Adress】

WT
 Trace and 沃特ch Data,一条强大指令,对进行流程做Profile

#
查看句柄

!handle  // 查看全数句柄的ID

!handle 000007f8 1  // 查看ID为000007f8的句柄的品种

!handle 000007f8 4  // 查看ID为000007f8的句柄的名称

!handle 0 5  // 查看全数句柄的品类和称号

!htrace -enable  //
使用windbg调试运行时,启用跟踪所有打开句柄或关闭句柄的调用以及相应的栈回溯

!htrace  //
进程运行截至后,打字与印刷全体打开句柄或关闭句柄的调用以及相应的栈回溯

!htrace -diff  // 只打字与印刷没有停歇的句柄的音讯及栈回溯

Handle = 0x00000038 – OPEN
Thread ID = 0x00001f34, Process ID =
0x00000638

0x049ca83c: +0x049ca83c
0x049d5eb4: +0x049d5eb4
0x046c8313: +0x046c8313
0x76d2d90a: +0x76d2d90a
0x7451c1ff: +0x7451c1ff
0x7450d18f: +0x7450d18f
0x74492776: +0x74492776
0x7450d286: +0x7450d286
0x7450c69e: +0x7450c69e
0x76d210d6: +0x76d210d6
0x76d7dc30: +0x76d7dc30
0x76d0b17e: +0x76d0b17e
0x76ee0166:
ntdll!NtCreateFile+0x00000012
0x7542c76b:
KERNELBASE!CreateFileW+0x0000035e
0x752c3f66:
kernel32!CreateFileW+0x0000004a
0x752c53c4:
kernel32!CreateFileA+0x00000036


Parsed 0x1 stack traces.
Dumped 0x1 stack traces.

 

#
查看变量

===  0n(十进制)  0x(十六进制)  0t(8进制)
 0y(2进制)    能够选拔n [8|10|16]命令来修改数值进制表示方法(输入n可查阅当前进制,暗中认可为16进制)===


VC6.0的Link选项须要将/pdbtype:sept改为/pdbtype:con,
不然转移的pdb文件少将不包罗如自定义结构体,类等音讯

dt nRet  // 查看局地变量nRet的项目与值(函数参数变量请用dv命令)
–注:编写翻译器很多时候会把一部分局地变量优化掉,那一个时候就会并发找不到nRet符号的情事

dt ntdll!*
// 展现ntdll里的全数类型音信

dt
*!*IMAGE_DOS*  //
突显全数模块中包括IMAGE_DOS字符的类型音信

test1!IMAGE_DOS_HEADER
test1!PIMAGE_DOS_HEADER
test1!_IMAGE_DOS_HEADER
ntdll!_IMAGE_DOS_HEADER
ntdll32!_IMAGE_DOS_HEADER
MSVCR90D!IMAGE_DOS_HEADER
MSVCR90D!PIMAGE_DOS_HEADER
MSVCR90D!_IMAGE_DOS_HEADER

dt
myApp!g_app //
表示展现myApp进度里全局变量g_app的内部存款和储蓄器布局(注:vc6见上述表达)

dt
WindbgTest!CTest //
查看模块WindbgTest的CTest的内部存款和储蓄器布局,加上-b
-r参数能够展示个中类及数组的音讯(注:vc6见上述表达)

dt
WindbgTest!CTest 0x0041f8d4  //
将0x0041f8d4地方处剧情依据模块WindbgTest的CTest的内部存款和储蓄器布局来分析(注:vc6见上述表达)

Windbg暗中同意会用寄存器ECX里面包车型大巴值作为this指针地址,其实这么是有时候是破绽百出的。
稍微C++编写翻译器在做代码优化之后会把
this指针放在别的寄存器里面,比如ESI。
之所以在调节的时候还索要读一下汇编代码来明确this
在哪个寄存器里面。
比如说我们看看 MOV EAX, dword ptr [ESI +
0x48h](获取当前目标内部存款和储蓄器偏移为0x48h处的4字节成员变量),就能够判定ESI
是this 指针。
那会儿能够通过如下命令打字与印刷this的内部存款和储蓄器结构:dt
-b 模块名!类名 @esi

dt tagMSG
0x0336e54c  //
类型要使用tagMSG,无法采纳typedef发生出的MSG

typedef struct tagMSG {
    HWND hwnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
} MSG, *PMSG;

dt
this // 查看this指针的门类及成员变量(注:vc6见上述表达)

dt -b
this  //
查看this指针的品类及成员变量,借使某1/10员变量为结构体,则把其布局成员也相继打字与印刷出来

             
 // -b开关钦命递归显示全数子类型消息,-r[n]钦赐递归呈现的深度,如-r0意味着不显得子类型音信

dt -v _PEB
@$PEB // 使用详细形式查看PEB(process’s environment
block)内部存款和储蓄器结构

dt _TEB ny
LastErrorValue // 只查看TEB(thread’s environment
block)结构成员LastErrorValue

??
this->m_nPen  // 查看成员变量的值(注:vc6见上述表达)

??
this // 查看this指针中的成员变量(注:vc6见上述表达)

?
nCount //
突显局地变量nCount的地方(前边4198708为10进制表示地址,004010d0为16进制表示地址)
形如:伊娃luate expression: 4198808 = 004010d0

? HeapTest!CTest::Add  //
展现HeapTest模块中CTest类中的Add函数地址

dv   // 突显当前函数内拥有片段变量,函数参数的值

dv n*  // 突显当前函数内n开端的持有片段变量,函数参数的值

dv
nCount // 查看局地变量nCount的值

dv a
// 查看函数参数变量a的值

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

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

x
 //
用法和dv命令一致,彰显当前函数内装有片段变量,函数参数变量的地址与值  –注:编写翻译器很多时候会把有个别片段变量优化掉,这一个时候就会油不过生找不到符号的意况

#调用堆栈

k  // 展现当前调用堆栈

kn // 带栈编号呈现当前调用堆栈

kb  // 打字与印刷出前1个函数参数的当下调用堆栈

02a9ffec 00000000 01e511f9 0174c570

00000000 kernel32!BaseThreadStart+0x37

kernel32!BaseThreadStart+0x37
当前函数kernel32!BaseThreadStart执行的通令地址。
01e511f9 0174c570 00000000
 参数相关的数值【从左到右 — 参数1  参数2:offset为sizeof(参数1)
 参数3:offset为sizeof(参数1)+sizeof(参数2)
 …】。注:假如是成员函数,this指针通过ecx或别的寄存器来传递
02a9ffec 00000000是 当前函数ebp 和
上层函数重返地址。

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

Windows 7 Ultimate Service Pack 1 [Build
6.1.7601]
CPU: Intel(R) Core(TM) i3-2100 CPU @
3.10GHz
《Game》 20.15.1112

6EF76A43E6B1DD58907F3E066506E918

Type:
EXCEPTION_ACCESS_VIOLATION//违规地址访问非凡
Error: Read
address 0x00074685//读取0x00074685地方出错(该地方对应的内部存款和储蓄器页,进度无读取权限)
Address:
64DCAF68//崩溃发生的指令地址

CallStack:

//0x64D70000为模块MSVCSportage90.dll的集散地址,3AF68为夭亡指令在模块中的偏移值,(0492B5D0,00074685,0000000C,00462482)为参数音讯
0x64D90000[3AF68] MSVCR90.dll:
(0492B5D0,00074685,0000000C,00462482)
0X00400000[11158A] tgame.exe:
(0492B5D0,00074685,00000000,00000000)

kb 5 // 只展现最上的5层调用堆栈

kv  
// 在kb的根基上平添了函数调用约定、FPO等消息

kp
 // 展现每一层函数调用的全部参数,包含参数类型、名字、取值(必须是欧洲经济共同体符号的图景下,private
symbols);注意:若程序被优化,这个值不必然对

kd
 // 打字与印刷堆栈的地点

kD
 // 从眼下esp地址处,向高地址方向搜索符号(注:函数是符号的一种)

dds 02a9ffec  //
从02a9ffec地址处,向高地址方向查找符号(注:函数是符号的一种)

dds
 // 执行完dds 02a9ffec后,可透过dds命令继续拓展检索

.frame // 显示当前栈帧

.frame
n  // 显示号码为n的栈帧(n为16进制数)

.frame /r
n // 呈现编号n的栈帧(n为16进制数) 并显示寄存器变量

.frame /c n // 设置编号n的栈帧为如今栈帧(n为16进制数)

!uniqstack // 呈现全部线程的调用堆栈

!findstack
kernel32 2
// 显示包蕴kernel32模块(用星号标出)的全部栈的音信

 

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

案例:有个别Unity游戏在关闭时的夭折堆栈

实际崩溃的来头:0x47e2740为游乐脚本中编辑的新窗口处理函数地址,关闭程序时,游戏脚本从内部存款和储蓄器中被卸载,0x47e2740改成了野指针引发崩溃

注:0x47e2740是娱乐脚本新窗口处理函数被虚拟机JIT发生出来的地址,在线程的Native栈上是不曾标记的,托管代码都有那一个特点

图片 7

 

#翻看汇编

u .  // 反汇编当前eip寄存器地址的后8条指令

u $eip  // 反汇编当前eip寄存器地址的后8条指令

ub .  // 反汇编当前ip寄存器地址的前8条指令

ub $eip  // 反汇编当前eip寄存器地址的前8条指令

u main+0x29 L30 // 反汇编main+0x29地方的后30条指令

u  //
反编写翻译下8条指令

uf CTest::add  // 反汇编CTest类的add函数

uf /c main  //
反汇编main函数,通过/c能够查看main函数中的函数调用(call)都有怎样

ub 000c135d L20  // 查看地址为000c135d限令前的20条指令内容

 

#寄存器

r // 显示全体寄存器音讯及产生core所在的下令

r eax, edx // 呈现eax,edx寄存器消息

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

#内存

— 注:windbg不协助中文呈现

!address //
查看进度的具有内部存款和储蓄器页属性

!address -summary  //
显示进程的内部存款和储蓄器总计音信  要为fulldmp才会准确

!address -f:stack  //
查看栈的内部存储器音讯,红框为主线程、篮框为windbg注入的长途线程

图片 8

!address 7ffd九千  // 查看7ffd九千地方处内部存款和储蓄器页属性

dd /c 5 7c801e02  //
从7c801e02内存处初始以dword为单位展现内部存款和储蓄器(宽度为:5)【暗许展现128字节长度的始末】

dd /c 5
7c801e02 L8  //
从7c801e02内部存款和储蓄器处开头以dword为单位展现内存(宽度为:5)【突显七个dword】

da /c 100
7c80ff03  //
从7c80ff03内部存款和储蓄器处早先展现Ascii字符串(宽度为:100)

du /c 100
7c8022f5  //
从7c8022f5内部存款和储蓄器处起初显示Unicode字符串(宽度为:100)

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

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

a = ascii chars
u = Unicode chars
b = byte + ascii   —
和UE一样,左侧为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内存处先河,显示byte及二进制(宽度为:3)

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

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

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

s -w
522e0000 L0x100  0x1212 0x2212 0x1234 //
表示在初叶地址522e0000自此的0x九十九个单位内搜索0x1212 0x2212
0x1234名目繁多的最先地址

s -u
522e0000 527d一千 “web”
 //表示在522e0000 和527d一千里面搜索Unicode 字符串”web”

ea 0x445634
“abc”  //
表示在0x445634地址写入Ascii字符串abc, 不带有结束符0

eza 0x445634
“abc”  // 表示在0x445634地址写入Ascii字符串abc,
包蕴截止符0

eu 0x445634 “abc”  //
表示在0x445634地点写入Unicode字符串abc, 不分包停止符0

ezu 0x445634 “abc”  // 表示在0x445634地方写入Unicode字符串abc,
包括结束符0

ed nCounter
80  //
将变量nCounter的值修改为80(注:80为10进制依旧16进制,依旧别的,取决于当前进制)

.writemem
D:\Test\0041a5e4.bin 0041a5e4 L一千  //
将内部存款和储蓄器地址处0x0041a5e4前面0x一千尺寸的剧情拷贝存款和储蓄到D:\Test\0041a5e4.bin中

#查看堆(Heap)

!heap
-s  //
展现进程堆的个数(每一项是三个堆,也正是_HEAP结构指针,对应的API是HeapCreate)

Heap Flags Reserv Commit Virt Free List
UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap


00140000 50000062 1024 12 12 1 1 1 0 0 L

00240000 50001062 64 24 24 15 1 1 0 0 L

00250000 50008060 64 12 12 10 1 1 0 0

00380000 50001063 64 12 12 4 2 1 0 bad


dt _HEAP
00150000  // 选择两个堆的地点,打字与印刷该堆的内部存款和储蓄器结构

ntdll!_HEAP
+0x000 Entry : _HEAP_ENTRY
+0x008 Signature : 0xeeffeeff
+0x00c Flags : 0x50000062
+0x010 ForceFlags : 0x40000060
+0x014 VirtualMemoryThreshold :
0xfe00
+0x018 SegmentReserve : 0x100000
+0x01c SegmentCommit : 0x2000
+0x020 DeCommitFreeBlockThreshold :
0x200
+0x024 DeCommitTotalFreeThreshold :
0x2000
+0x028 TotalFreeSize : 0xaf
+0x02c MaximumAllocationSize :
0x7ffdefff
+0x030 ProcessHeapsListIndex : 1
+0x032 HeaderValidateLength :
0x608
+0x034 HeaderValidateCopy : (null)

+0x038 NextAvailableTagIndex : 0
+0x03a MaximumTagIndex : 0
+0x03c TagEntries : (null)
+0x040 UCRSegments : (null)
+0x044 UnusedUnCommittedRanges :
0x00140598 _HEAP_UNCOMMMTTED_RANGE
+0x048 AlignRound : 0x17
+0x04c AlignMask : 0xfffffff8
+0x050 VirtualAllocdBlocks :
_LIST_ENTRY [ 0x140050 – 0x140050 ]
+0x058 Segments : [64] 0x00140640
_HEAP_SEGMENT
+0x158 u : __unnamed
+0x168 u2 : __unnamed
+0x16a AllocatorBackTraceIndex :
0
+0x16c NonDedicatedListLength :
1
+0x170 LargeBlocksIndex : (null)

+0x174 PseudoTagEntries : (null)

+0x178 FreeLists : [128] _LIST_ENTRY
[ 0x142a90 – 0x142a90 ]
+0x578 LockVariable : 0x00140608
_HEAP_LOCK
+0x57c CommitRoutine : (null)
+0x580 FrontEndHeap : 0x00140688
Void
+0x584 FrontHeapLockCount : 0
+0x586 FrontEndHeapType : 0x1 ”
+0x587 LastSegmentIndex : 0 ”

!heap -a 001四千0 //
选拔1个堆的地点,打印该堆的新闻,比地点打字与印刷内部存款和储蓄器命令更详尽直观

Index Address Name Debugging options
enabled
1: 00140000
Segment at 00140000 to 00240000 (00003000
bytes committed)
Flags: 50000062
ForceFlags: 40000060
Granularity: 8 bytes
Segment Reserve: 00100000
Segment Commit: 00002000
DeCommit Block Thres: 00000200
DeCommit Total Thres: 00002000
Total Free Size: 000000af
Max. Allocation Size: 7ffdefff
Lock Variable at: 00140608
Next TagIndex: 0000
Maximum TagIndex: 0000
Tag Entries: 00000000
PsuedoTag Entries: 00000000
Virtual Alloc List: 00140050
UCR FreeList: 00140598
FreeList Usage: 00000000 00000000
00000000 00000000
FreeList[ 00 ] at 00140178: 00142a90 .
00142a90
00142a88: 00050 . 00578 [14] –
free
Segment00 at 00140640:
Flags: 00000000
Base: 00140000
First Entry: 00140680
Last Entry: 00240000
Total Pages: 00000100
Total UnCommit: 000000fd
Largest UnCommit:000fd000
UnCommitted Ranges: (1)
00143000: 000fd000

Heap entries for Segment00 in Heap
00140000
00140000: 00000 . 00640 [01] – busy
(640)
00140640: 00640 . 00040 [01] – busy
(40)
00140680: 00040 . 01818 [07] – busy
(1800), tail fill – unable to read heap entry extra at 00141e90
00141e98: 01818 . 00040 [07] – busy
(22), tail fill – unable to read heap entry extra at 00141ed0
00141ed8: 00040 . 00050 [07] – busy
(36), tail fill – unable to read heap entry extra at 00141f20
00141f28: 00050 . 002f0 [07] – busy
(2d8), tail fill – unable to read heap entry extra at 00142210
00142218: 002f0 . 00330 [07] – busy
(314), tail fill – unable to read heap entry extra at 00142540
00142548: 00330 . 00330 [07] – busy
(314), tail fill – unable to read heap entry extra at 00142870
00142878: 00330 . 00040 [07] – busy
(24), tail fill – unable to read heap entry extra at 001428b0
001428b8: 00040 . 00028 [07] – busy
(10), tail fill – unable to read heap entry extra at 001428d8
001428e0: 00028 . 00058 [07] – busy
(40), tail fill – unable to read heap entry extra at 00142930
00142938: 00058 . 00058 [07] – busy
(40), tail fill – unable to read heap entry extra at 00142988
00142990: 00058 . 00060 [07] – busy
(44), tail fill – unable to read heap entry extra at 001429e8
001429f0: 00060 . 00020 [07] – busy
(1), tail fill – unable to read heap entry extra at 00142a08
00142a10: 00020 . 00028 [07] – busy
(10), tail fill – unable to read heap entry extra at 00142a30
00142a38: 00028 . 00050 [07] – busy
(36), tail fill – unable to read heap entry extra at 00142a80
00142a88: 00050 . 00578 [14] free
fill
00143000: 000fd000 – uncommitted
bytes.

#虚拟内部存储器

!vadump  // 查看虚拟内部存款和储蓄器布局 

#安装事件产生时windbg行为

sx // 显示windbg境遇各样非常和事件时的行事

sxr // 将装有越发和事件过滤器的意况重设为暗中同意值

sxe  ld // 当加载模块时,立时暂停(Break)到调节和测试器中(First-Chance)

sxe ld mono.dll  // 当加载mono.dll模块时,立时暂停(Break)到调节和测试器中(First-Chance)

sxd ud //
当卸载模块时,windbg不会在第三回拍卖机会时停顿(纵然会突显音讯)。假使别的错误处理器没有处理掉该越发,执行会停止下来并暂停(Break)到windbg中(Second-Chance)

sxd
av // 全部尤其和事件只有Second-Chance才中断到调节和测试器

sxn et // 当线程退出时,windbg会打字与印刷出一条音讯

sxi ct // 当线程成立时,windbg不停顿也不打字与印刷音讯

sxi c0000005  // 不间歇也不打字与印刷code码为c0000005的13分

 

#dump输出

 .dump /ma “d:\mydmpfile.dmp”
// 将最近调节和测试进度输出Dump文件

#任何元命令

.tlist  // 显示全体进度

.cls  // 清除屏幕

.shell
config.bat  // 执行config.bat批处理文件

.shell
tasklist  // 列出全部进度新闻

.formats
‘a’  // 彰显字母a的种种类型对应的音讯

图片 9

.logopen
c:\1.log   // 将command内容输出到c:\1.log文件中

.logclose  // 关闭当前开拓的日志

#其余扩充命令

!analyze -v  // 详细展现当前十一分音信

!analyze
-hang  // 诊断线程调用栈上是还是不是有任何线程阻塞了其余线程

!analyze
-f  // 查看分外分析音信,纵然调节和测试器并未诊断出11分

!tls -1 // 展现当前线程全部的slot音信

!tls 2   // 呈现当前线程索引为2的slot音信

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

PEB at 7efde000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 00f20000
Ldr 76fa0200
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList:
003a4d78 . 003e4a00
Ldr.InLoadOrderModuleList: 003a4ce8 .
003e49f0
Ldr.InMemoryOrderModuleList: 003a4cf0 .
003e49f8
Base TimeStamp Module
f20000 54772f74 Nov 27 22:04:36 2014
C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe
76ea0000 5684255b Dec 31 02:41:31 2015
C:\windows\SysWOW64\ntdll.dll
74790000 568425ff Dec 31 02:44:15 2015
C:\windows\syswow64\kernel32.dll
75b00000 56842600 Dec 31 02:44:16 2015
C:\windows\syswow64\KERNELBASE.dll
… …
71d40000 55a5cad6 Jul 15 10:52:06 2015
C:\windows\System32\msxml6.dll
71d20000 4a5bdb38 Jul 14 09:11:20 2009
C:\windows\System32\bcrypt.dll
71ce0000 5600ce51 Sep 22 11:43:13 2015
C:\windows\SysWOW64\bcryptprimitives.dll
SubSystemData: 00000000
ProcessHeap: 003a0000
ProcessParameters: 003a2188
CurrentDirectory:
‘C:\windows\system32\’
WindowTitle: ‘”C:\Program Files
(x86)\Citrix\ICA Client\wfcrun32.exe”‘
ImageFile: ‘C:\Program Files
(x86)\Citrix\ICA Client\wfcrun32.exe’
CommandLine: ‘”C:\Program Files
(x86)\Citrix\ICA Client\wfcrun32.exe” -Embedding’
DllPath: ‘C:\Program Files
(x86)\Citrix\ICA
Client;C:\windows\system32;C:\windows\system;C:\windows;
Environment: 003a07f0
=::=::\
ALLUSERSPROFILE=C:\ProgramData

APPDATA=C:\Users\kekec\AppData\Roaming
CommonProgramFiles=C:\Program Files
(x86)\Common Files
CommonProgramFiles(x86)=C:\Program Files
(x86)\Common Files
CommonProgramW6432=C:\Program
Files\Common Files
COMPUTERNAME=KEKEC-PC1

ComSpec=C:\windows\system32\cmd.exe
DXSDK_DIR=D:\Program Files
(x86)\Microsoft DirectX SDK (June 2010)\
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\kekec
include=D:\Program Files
(x86)\Microsoft Visual Studio\VC98\atl\include;D:\Program Files
(x86)\Microsoft Visual Studio\VC98\mfc\include;
lib=D:\Program Files (x86)\Microsoft
Visual Studio\VC98\mfc\lib;D:\Program Files (x86)\Microsoft Visual
Studio\VC98\lib

LOCALAPPDATA=C:\Users\kekec\AppData\Local
LOGONSERVER=\\GM-HEIJI
MSDevDir=D:\Program Files
(x86)\Microsoft Visual Studio\Common\MSDev98
NUMBER_OF_PROCESSORS=8
OS=Windows_NT

Path=C:\ProgramData\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\Program
Files\Intel\Intel(R) Management Engine Components\DAL;

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6
Model 60 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3c03
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
(x86)
ProgramFiles(x86)=C:\Program Files
(x86)
ProgramW6432=C:\Program Files

PSModulePath=C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\windows

TEMP=C:\Users\kekec\AppData\Local\Temp

TMP=C:\Users\kekec\AppData\Local\Temp
USERDNSDOMAIN=TENCENT.COM
USERDOMAIN=TENCENT
USERNAME=kekec
USERPROFILE=C:\Users\kekec
VS120COMNTOOLS=D:\Program Files
(x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VS80COMNTOOLS=D:\Program Files
(x86)\Microsoft Visual Studio 8\Common7\Tools\
VS90COMNTOOLS=d:\Program Files
(x86)\Microsoft Visual Studio 9.0\Common7\Tools\
windir=C:\windows

!gle  // 打字与印刷当前线程方今的失实消息LastError

!gle -all  // 打字与印刷全体线程的近年的错误新闻

!error  897// 显示错误码为897的详细描述音讯

#帮助

华语在线援救:http://www.dbgtech.net/windbghelp/index.html

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

WinDbg
命令三部曲:(一)WinDbg
命令手册

相关文章