命令 (四)"/>
Windbg 命令 (四)
断言处理 ah
ahb [Address] // 指定地址的断言如果失败则中断调试器
ahi [Address] // 忽略指定地址断言的失败
ahd [Address] // 删除指定地址的断言信息
ahc // 删除进程的断言信息
ah // 显示当前的断言处理设置
对于断言也是系统的一个exception(STATUS_ASSERTION_EXCEPTION)。因此该命令只是设置指定位置断言的处理状态。而sx* asrt命令可以设置全局的断言处理状态。
访问断点 ba
访问断点有些地方也被称为数据断点。创建一个处理器断点,会在访问指定地址时中断。
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]// example
ba w 4 0xfffff80f`af0f0000 "k"
上面的例子就是给地址0xfffff80f`af0f0000处设置断点,当对这个地址进行写访问的时候就会执行k命令。
除了w写可以设置,e执行,r读,i I/O端口断点。Size代表需要monitor的内存长度,只能是1,2,4,8。
如果是用户态调试还能指定只给某个线程设置断点。
断点系列命令 bp, bm, bu, bs, bsc, br, bl, be, bd, bc
// 给指定指令地址设置断点
bp[ID] [Options] [Address [Passes]] ["CommandString"] // 给指定地址设置断点,允许当前module symbol不存在
bu[ID] [Options] [Address [Passes]] ["CommandString"] // 允许使用通配符*来批量设置断点。
bm [Options] SymbolPattern [Passes] ["CommandString"]// 列出当前存在的断点
bl [/L] [Breakpoints]// Disable断点
bd Breakpoints// Enable断点
be Breakpoints// 删除断点
bc Breakpoints// 给指定断点重新编号
br OldID NewID [OldID2 NewID2 ...] // 更新指定断点所指定的命令
bs ID ["CommandString"]// 更新指定条件断点的条件和命令
bsc ID Condition ["CommandString"]
对于windbg里面所操作的断点都是采用ID来编号,例如
0:007> bl0 e Disable Clear 00007ff8`093e52f0 0001 (0001) 0:**** ntdll!RtlInitAnsiString1 e Disable Clear 00007ff8`094e30f0 0001 (0001) 0:**** ntdll!RtlSetTimer2 e Disable Clear 00007ff8`094ee420 0001 (0001) 0:**** ntdll!RtlNtdllName
一旦通过bp等命令设置断点之后,可以使用be, bd, bc等命令来通过对应的ID来操作。
断点地址也可以指定为。bl命令会把所有命令都列出来,但是不会表明断点的类型,需要使用.bpcmds命令来显示每个断点的类型
0:007> .bpcmds
bp0 0x00007ff8`093e52f0 ;
bp1 0x00007ff8`094e30f0 ;
bp2 0x00007ff8`094ee420 ;
bu4 @!"ntdll!fltused";
对比内存 c
c Range Address// 例子
0:007> c 0x00007ff8`094ee426 L3 0x00007ff8`094ee42a
00007ff8`094ee426 00 - 00007ff8`094ee42a 1a
00007ff8`094ee428 18 - 00007ff8`094ee42c 00
可以对比两端内存的差异,并列列出不同的内容。如例中所示其中长度指定的3,但是输出只列出了两个有差异的字节。
显示内存 d, da, db, dc, dd, dD, df, dp, dq, du, dw, ds, dS,
d{a|b|c|d|D|f|p|q|u|w|W} [Options] [Range]
dy{b|d} [Options] [Range]
d [Options] [Range]
这一系列命令都可以看作d+显示格式。其中又能分为两类,以不同格式显示binary内容和显示显示成字符或者字符串内容。du, da, ds, dS就能够显示字符和字符串内容。需要注意的是ds和dS现实的是结构体STRING, ANSI_STRING, or UNICODE_STRING。而单纯显示字符串则使用du,da。
0:007> da 00007ff8`094ee430
00007ff8`094ee430 "HDP..."
0:007> dd 00007ff8`094ee430
00007ff8`094ee430 09504448 00007ff8 00480046 00000000
// ds,dS如果接受的不是一个正确的结构体,则会显示异常
0:007> ds 00007ff8`094ee430
00000000`00480046 "????????????????????????????????"
显示指针指向的内容 dda, ddp, ddu, dpa, dpp, dpu, dqa, dqp, dqu
针对一些指针数组之类的场景,我们希望批量显示指针指向的内容,而不是指针本身的值。这时候就需要使用dd*和dp系列的命令。先看例子
0:007> da 0x000000f8`0d1ffb78
000000f8`0d1ffb78 ".&B..."
0:007> dpa 0x000000f8`0d1ffb78
000000f8`0d1ffb78 00007ff8`094226a1 ". H..I....Q)."
0:007> da 0x00007ff8`094226a1
00007ff8`094226a1 ". H..I....Q)."
如例子所示,dpa将指定的地址当作一个指针加以解释,并且将其按照asiic字符进行显示。当然其效果也等于第三个命令,直接指定指针中的地址。
更多推荐
Windbg 命令 (四)
发布评论