windbg调试命令

windbg调试基本设置与命令
1、首先设置File==>Symbol File Path... ==>SRV*D:\DevLib\SymbolLocal*http://msdl.microsoft.com/download/symbols
2、打开源文件Open Source File...==>D:\DemoDump\DemoDump.cpp
3、添加所调试的pdb路径File==>Symbol File Path...==>Browse...==>SRV*D:\DevLib\SymbolLocal*http://msdl.microsoft.com/download/symbols;D:\VCdemo\DemoDump\Release
4、打开可执行文件File==>Open Executable...==>DemoDump.exe
5、断点命令bp
1> bp DemoDump!main 设置断点到main函数,不区分大小写 demodump == DemoDump
2>如果main函数是_tmain 则是 bp demodump!wmain
3>g或F5,执行到main断点
4>bl:列出所有断点
5>!address eax 查看对应内存页的属性
5>vertarget 显示当前进程的大致信息
6>!peb 显示process Environment block
7>lmv m dllname查看任意一个dll详细信息
8>.reload -f, .reload /!sym 加载符号文件
9>r 显示和修改寄存器上的值,如 r eax=0
10> d 显示esp寄存器指向的内存 如 d esp
11> e 可以用来修改内存地址,跟d命令一样,e命令后面也可以跟类型后缀,比如ed命
12> s 用来搜索内存
13>!runaway 显示每一个线程的cpu消耗 !runaway f 还可看到内核态的繁忙时间
14>~ 是用来切换目标线程 ~* 列出当前进程中的所有线程的详细信息 ~*kb 列出所有线程的堆栈
15>k 用来显示当前线程的堆栈
栈指令k[b|p|P|v]
这四条指令显示的内容类似,但是每个指令都有特色;
KB显示三个参数;
Kp显示所有的参数,但需要Full Symbols或Private PDBSymbols支持。KP与Kp相似,只是KP将参数换行显示了;
Kv用于显示FPO和调用约定;
KD,用于显示Stack的Dump,在跟踪栈时比较有用。这些指令区分大小。
16>u 把指定地址上的代码翻译成汇编输出 如:u 7738d023
17>x 查找符号的二进制地址如下 x msvcr!printf, x ntdll!Globalcounter
18>dds 打印内存地址上的二进值 dds ebp
19>dv 查看本地变量 dv /i, dv /V
20>!teb 显示当前线程块的执行块
21>!peb 显示当前进程的执行块 dt_peb <address>
22>ln[Address]显示当前地址上的对象类型
23>!handle可以获取整个进程或者某一个handle的详细信息然后找到一个key,查看详细信息
0:001>!handle 4 f
24>!htrace命令检查操作句柄的历史记录0:001>!htrace 384
25>!cs列出CriticalSection的详细信息
26> !dso 查看当前线程中有哪些对象,分析泄露时用到
27>dump保存进程的dump文件.dump /ma c://testdump.dmp
这个命令把当前进程的镜像保存为c://testdump.dmp,其中/ms参数表示dump的文件应该包含进程的完整信息。
 在windbg中,通过file—open---open Crash dump菜单打开dump文件进行分析。打开文件后,运行调试命令看到
 的信息和状态就是dump文件保存时进程的状态。通过dump文件能够方便的保存发生问题时进程的状态,方便事后分析。
28>
0: kd> !idt                           //查看中断向量表内容 
02.0: kd> dt nt!_KINTERRUPT 89c03bb0     //查看对应中断向量的详细内容 
03.0: kd> !ioapic                        //显示I/O APIC(即连接至设备的中断控制部件) 
04.0: kd> !pic                           //  
05.0: kd> !apic                          //有关PIC的配置情况 
29>!heap 查看堆信息  !heap -a 2c0000 查看堆详细信息,同样的,已知HEAP的首地址,那么先从HEAP下手好了,
dt _HEAP 002c0000可以显示HEAP的数据结构,然后用!heap -a 002c0000观察分配情况
30>!peb 命令得到peb地址xxxx,dt _PEB XXXXX命令查看peb结构

Windbg断点命令

1. 设置断点命令bu bp bm ba

1) bu bp bm设置软件断点

a). bp设置地址关联的断点

b). bu设置符号关联的断点

c). bm支持设置含通配符的断点,可以一次创建一个或多个bu或bp (bm /d)断点

bp和bu的主要区别

a) bp所设断点和地址关联,如果模块把该地址的指令移到其它地方,断点不会随之移动,而是依然关联在在原来的地址上; 而bu所设断点是和符号关联,如果符号的地址改变了,断点依然保持和原来的符号关联。

b) 如果bp所设断点的地址在加载的模块中被找到,后来软件模块被卸载,断点会被自动移除;而bu所设断点则会一直存在。

c) bp设置的断点不会被保存windbg的workspace中,bu设置的断点会则会被保存下来。

2)ba设置硬件断点(数据断点)

硬件断点是指当一个内存地址被访问(读、写、执行)或IO端口被访问时触发的断点。

2. 其它命令bl bc bd be .bpcmds

bl 列举所有断点和它们的状态

bc 删除对应断点

bd 禁用对应断点

be 启用对应断点

.bmcmds 列举所有断点以及创建它们的命令

3. 软件断点和硬件断点

1) 软件断点 - 调试工具控制的断点。当调试器在某个地址设置一个断点,它会首先把该地址的内容保存,零时插入一条中断指令(如int3 (0xCC)),当程序执行到该地址是cpu进入调试状态,当调试结束,程序重新载入该地址原先的指令重新执行下去。

2) 硬件断点 - 又称为数据断点,是处理器控制的断点,可以用来监控某个内存地址的访问(读、写、执行)和IO地址的访问(读、写)。处理器中有相应的调试寄存器,用来记录数据断点的地址,当该地址(内存地址或IO端口地址)被访问时,断点将被触发,cpu进入调试状态。

3) 软件断点和硬件断点的区别

a)理论上我们可以设置无穷多个软件断点,但设置软件断点会使程序变慢,尤其在内核态影响比较大,调试器大多会对断点数量加以限制。例如Windbg在内核态最多支持32个软件断点,在用户态则支持任意多个;硬件断点数量取决于处理器,例如X86支持四个断点(80386有八个调试寄存器-DR0~DR3用于断点,DR4~DR5保留,DR6~DR7用于控制)。

b)软件断点需要修改相应代码,所以它不能调试时flash和rom中的代码;而硬件则没有这个限制。

猜你喜欢

转载自blog.csdn.net/seamonkey/article/details/46490127