windbg 命令
Posted yanghongche
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windbg 命令相关的知识,希望对你有一定的参考价值。
[转自]:http://blog.csdn.net/chenyujing1234/article/details/7743460
一、
1、 !address eax
2、 vertarget
3 !peb
4、 lmvm
6、 lmf
7、 r
8、 d
9、 e
10、s
12、 ~ 命令是用来切换目标线程
15、 k 命令用来显示当前线程的堆栈,如下
16 、u 命令把指定地址上的代码翻译成汇编输出
17 、x 查找符号的二进制地址如下
18、 dds 打印内存地址上的二进制值
19 .frame
20、 dt 格式化显示资料
21、 bp 设定调试断点
22、 bm 使用模式匹配设置断点
23、 ba 对内存访问设置断点 break on access
24 、bl 列出所有的断点 break list
25、 bc 清除断点 break clear
26、 be 开启断点 break enable
27、 bd禁用断点 break disable
28、跟踪指令T,TA,TB,TC,WT,P,PA,PC
29、源代码操作指令.,lsf,lsc,ls,l,lsp
30 、查询符号
31、!gle 查看LastError值
32、指定进制的形式0x/0n/0t/y 分别表示 16/10/8/2进制
34、srcpath 设置源代码的路径
35、dv查看本地变量
36、!teb 显示当前线程的执行块(execution block)
37、!peb 显示当前进程的执行块(execution block)
38、ln[Address] 显示当前地址上的对象类型
39、!locks 显示死锁
40、!handle可以获取整个进程或者某一个handle的详细信息
42、!cs列出CriticalSection的详细信息
43、!threadpool能看到完成端口,线城池工作线程和timer回调占线程池的情况
44、time 可以看到进程跑了多长时间
45、 !dso 查看当前线程中有哪些对象,分析泄露时用到
46、dump保存进程的dump文件
47、
[plain] view plain copy- 0: kd> !idt //查看中断向量表内容
- 0: kd> dt nt!_KINTERRUPT 89c03bb0 //查看对应中断向量的详细内容
- 0: kd> !ioapic //显示I/O APIC(即连接至设备的中断控制部件)
- 0: kd> !pic //
- 0: kd> !apic //有关PIC的配置情况
- 0: kd> !idt
- Dumping IDT:
- 37: 806e7864 hal!PicSpuriousService37
- 3d: 806e8e2c hal!HalpApcInterrupt
- 41: 806e8c88 hal!HalpDispatchInterrupt
- 50: 806e793c hal!HalpApicRebootService
- 63: 89ac57e4 USBPORT!USBPORT_InterruptService (KINTERRUPT 89ac57a8)
- USBPORT!USBPORT_InterruptService (KINTERRUPT 8982abb0)
- 73: 89d6767c atapi!IdePortInterrupt (KINTERRUPT 89d67640)
- atapi!IdePortInterrupt (KINTERRUPT 89dc4bb0)
- 83: 89c1471c VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 89c146e0)
- HDAudBus!AzController::Isr (KINTERRUPT 89c16ac8)
- NDIS!ndisMIsr (KINTERRUPT 89847bb0)
- 94: 8976fbec USBPORT!USBPORT_InterruptService (KINTERRUPT 8976fbb0)
- a4: 89770bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89770bb0)
- b1: 89d859e4 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 89d859a8)
- b4: 89c03bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89c03bb0)
- c1: 806e7ac0 hal!HalpBroadcastCallService
- d1: 806e6e54 hal!HalpClockInterrupt
- e1: 806e8048 hal!HalpIpiHandler
- e3: 806e7dac hal!HalpLocalApicErrorService
- fd: 806e85a8 hal!HalpProfileInterrupt
- fe: 806e8748 hal!HalpPerfInterrupt
- //前部分是使用的中断类型号。例如83号中断是有三个硬件复用。
2.0: kd> dt nt!_KINTERRUPT 89c03bb0,运行后显示为
[plain] view plain copy- 0: kd> dt nt!_KINTERRUPT 89c03bb0
- +0x000 Type : 0n22
- +0x002 Size : 0n484
- +0x004 InterruptListEntry : _LIST_ENTRY [ 0x89c03bb4 - 0x89c03bb4 ]
- +0x00c ServiceRoutine : 0xb9159e54 unsigned char USBPORT!USBPORT_InterruptService+0
- +0x010 ServiceContext : 0x89c38028 Void
- +0x014 SpinLock : 0
- +0x018 TickCount : 0xffffffff
- +0x01c ActualLock : 0x89c03e14 -> 0
- +0x020 DispatchAddress : 0x805466d0 void nt!KiInterruptDispatch+0
- +0x024 Vector : 0x1b4
- +0x028 Irql : 0xa ''
- +0x029 SynchronizeIrql : 0xa ''
- +0x02a FloatingSave : 0 ''
- +0x02b Connected : 0x1 ''
- +0x02c Number : 0 ''
- +0x02d ShareVector : 0x1 ''
- +0x030 Mode : 0 ( LevelSensitive )
- +0x034 ServiceCount : 0
- +0x038 DispatchCount : 0xffffffff
- +0x03c DispatchCode : [106] 0x56535554
3.0: kd> !ioapic,运行后显示
[plain] view plain copy- 0: kd> !ioapic
- IoApic @ FEC00000 ID:8 (20) Arb:170020
- Inti00.: 52000000`000100ff Vec:FF FixedDel Ph:52000000 edg high m
- Inti01.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti02.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti03.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti04.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti05.: 52c00000`000100ff Vec:FF FixedDel Ph:52C00000 edg high m
- Inti06.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti07.: 02000000`000100ff Vec:FF FixedDel Ph:02000000 edg high m
- Inti08.: 01000000`000008d1 Vec:D1 FixedDel Lg:01000000 edg high
- Inti09.: 03000000`0000d9b1 Vec:B1 LowestDl Lg:03000000-Pend lvl high rirr
- Inti0A.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti0B.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0C.: 42000000`000100ff Vec:FF FixedDel Ph:42000000 edg high m
- Inti0D.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0E.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti0F.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti10.: 03000000`0000f983 Vec:83 LowestDl Lg:03000000-Pend lvl low rirr
- Inti11.: 00000000`000100ff Vec:FF FixedDel Ph:00000000 edg high m
- Inti12.: 03000000`0000a994 Vec:94 LowestDl Lg:03000000 lvl low
- Inti13.: 00c00000`000100ff Vec:FF FixedDel Ph:00C00000 edg high m
- Inti14.: 03000000`0000a973 Vec:73 LowestDl Lg:03000000 lvl low
- Inti15.: 03000000`0000a963 Vec:63 LowestDl Lg:03000000 lvl low
- Inti16.: 03000000`0000a9a4 Vec:A4 LowestDl Lg:03000000 lvl low
- Inti17.: 03000000`0000f9b4 Vec:B4 LowestDl Lg:03000000-Pend lvl low rirr
4.0: kd> !pic ,运行后显示
[plain] view plain copy- 0: kd> !pic
- ----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
- Physically in service: . . . . . . . . . . . . . . . .
- Physically masked: Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
- Physically requested: Y . . Y . Y . . Y Y Y Y . . . .
5.0: kd> !apic,运行后显示
[plain] view plain copy- 0: kd> !apic
- Apic @ fffe0000 ID:0 (50014) LogDesc:01000000 DestFmt:ffffffff TPR FF
- TimeCnt: 0fdad680clk SpurVec:1f FaultVec:e3 error:40
- Ipi Cmd: 02000000`000008e1 Vec:E1 FixedDel Lg:02000000 edg high
- Timer..: 00000000`000300fd Vec:FD FixedDel Dest=Self edg high m
- Linti0.: 00000000`0001001f Vec:1F FixedDel Dest=Self edg high m
- Linti1.: 00000000`000084ff Vec:FF NMI Dest=Self lvl high
- TMR: 63, 73, 83, 94, A4, B1, B4
- IRR: 41, B1, D1
- ISR: D1
48、.cls
.cls用于清屏
二、
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中的代码;而硬件则没有这个限制。
3. 参考资料
1. http://www.lslnet.com/linux/dosc1/59/linux-389058.htm
2. http://blog.csdn.net/wingeek/article/details/4025475
3. http://embexperts.com/viewthread.php?tid=69
4. http://msdn.microsoft.com/en-us/library/ff538903%28v=VS.85%29.aspx
5. http://msdn.microsoft.com/en-us/library/ff538165%28v=VS.85%29.aspx
6. http://msdn.microsoft.com/en-us/library/ff553451%28v=VS.85%29.aspx
1. 使用!process 0 0 获取用户空间的所有的进程的信息
如果有多个相同进程名,!process 0 0 SampleExe.exe
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529b68 TableSize: 50.
Image: System
2.使用.process /i 指定进程地址
因为要对用户态代码下断点,这里不用/p,而使用/i
If you want to use the kernel debugger to set breakpoints in user space, use the/i option to switch the target to the correct process context.
3. g继续,再次发生int 3中断后,进程Context就已切换,使用!process查看确认。
4. reload符号文件。
5. bu, bp下用户态断点。
以上是关于windbg 命令的主要内容,如果未能解决你的问题,请参考以下文章