• windbg 常用命令详解


     = 
    kd> ln 8046e100 
    (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendResource
    Exact matches: 
    nt!KeServiceDescriptorTableShadow =

    31、!gle 查看LastError值
    32、指定进制的形式0x/0n/0t/y 分别表示 16/10/8/2进制

    ? 0x12345678+0n10 
    Evaluate expression: 305419906 = 12345682 
    33、!sym noice/quiet symbol prompts开关

    34、srcpath 设置源代码的路径
    35、dv查看本地变量
    36、!teb 显示当前线程的执行块(execution block)
    37、!peb 显示当前进程的执行块(execution block)
    38、ln[Address] 显示当前地址上的对象类型
    39、!locks 显示死锁
    40、!handle可以获取整个进程或者某一个handle的详细信息

    首先运行以下!handle,可以看到当前进程的每个一个handle的类型,以及统计信息
    0:002>!handle
    Handle 4
    Type key
    Handle c
    Type keyEvent
    …….
    然后找到一个key,查看详细信息
    0:001>!handle 4 f
    就会列出这个handle的详细信息。
    41!htrace命令检查操作句柄的历史记录
    !htrace命令可以打印出指定的handle的最近几次调用堆栈
    0:001>!htrace 384

    42、!cs列出CriticalSection的详细信息
    43、!threadpool能看到完成端口,线城池工作线程和timer回调占线程池的情况
    44、time 可以看到进程跑了多长时间
    45、 !dso 查看当前线程中有哪些对象,分析泄露时用到
    46、dump保存进程的dump文件

    Dump文件是进程的内存镜像,

    可当在调试器中打开dump文件时,使用上面的命令检查,看到的结果跟用调试检查进程看到的一样
    .dump /ma c://testdump.dmp
    这个命令把当前进程的镜像保存为c://testdump.dmp,其中/ms参数表示dump的文件应该包含进程的完整信息。
    在windbg中,通过file—open---open Crash dump菜单打开dump文件进行分析。打开文件后,运行调试命令看到的信息和状态就是dump文件保存时进程的状态。通过dump文件能够方便的保存发生问题时进程的状态,方便事后分析。

    47、
    [plain] view plaincopy
     
    1. 0: kd> !idt                           //查看中断向量表内容  
    2. 0: kd> dt nt!_KINTERRUPT 89c03bb0     //查看对应中断向量的详细内容  
    3. 0: kd> !ioapic                        //显示I/O APIC(即连接至设备的中断控制部件)  
    4. 0: kd> !pic                           //   
    5. 0: kd> !apic                          //有关PIC的配置情况  


    kd> !idt运行后显示为

    [plain] view plaincopy
     
    1. 0: kd> !idt  
    2.   
    3. Dumping IDT:  
    4.   
    5. 37: 806e7864 hal!PicSpuriousService37  
    6. 3d: 806e8e2c hal!HalpApcInterrupt  
    7. 41: 806e8c88 hal!HalpDispatchInterrupt  
    8. 50: 806e793c hal!HalpApicRebootService  
    9. 63: 89ac57e4 USBPORT!USBPORT_InterruptService (KINTERRUPT 89ac57a8)  
    10.              USBPORT!USBPORT_InterruptService (KINTERRUPT 8982abb0)  
    11. 73: 89d6767c atapi!IdePortInterrupt (KINTERRUPT 89d67640)  
    12.              atapi!IdePortInterrupt (KINTERRUPT 89dc4bb0)  
    13. 83: 89c1471c VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 89c146e0)  
    14.              HDAudBus!AzController::Isr (KINTERRUPT 89c16ac8)  
    15.              NDIS!ndisMIsr (KINTERRUPT 89847bb0)  
    16. 94: 8976fbec USBPORT!USBPORT_InterruptService (KINTERRUPT 8976fbb0)  
    17. a4: 89770bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89770bb0)  
    18. b1: 89d859e4 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 89d859a8)  
    19. b4: 89c03bec USBPORT!USBPORT_InterruptService (KINTERRUPT 89c03bb0)  
    20. c1: 806e7ac0 hal!HalpBroadcastCallService  
    21. d1: 806e6e54 hal!HalpClockInterrupt  
    22. e1: 806e8048 hal!HalpIpiHandler  
    23. e3: 806e7dac hal!HalpLocalApicErrorService  
    24. fd: 806e85a8 hal!HalpProfileInterrupt  
    25. fe: 806e8748 hal!HalpPerfInterrupt  
    26. //前部分是使用的中断类型号。例如83号中断是有三个硬件复用。  


     

    2.0: kd> dt nt!_KINTERRUPT 89c03bb0,运行后显示为

    [plain] view plaincopy
     
    1. 0: kd> dt nt!_KINTERRUPT 89c03bb0  
    2.    +0x000 Type             : 0n22  
    3.    +0x002 Size             : 0n484  
    4.    +0x004 InterruptListEntry : _LIST_ENTRY [ 0x89c03bb4 - 0x89c03bb4 ]  
    5.    +0x00c ServiceRoutine   : 0xb9159e54     unsigned char  USBPORT!USBPORT_InterruptService+0  
    6.    +0x010 ServiceContext   : 0x89c38028 Void  
    7.    +0x014 SpinLock         : 0  
    8.    +0x018 TickCount        : 0xffffffff  
    9.    +0x01c ActualLock       : 0x89c03e14  -> 0  
    10.    +0x020 DispatchAddress  : 0x805466d0     void  nt!KiInterruptDispatch+0  
    11.    +0x024 Vector           : 0x1b4  
    12.    +0x028 Irql             : 0xa ''  
    13.    +0x029 SynchronizeIrql  : 0xa ''  
    14.    +0x02a FloatingSave     : 0 ''  
    15.    +0x02b Connected        : 0x1 ''  
    16.    +0x02c Number           : 0 ''  
    17.    +0x02d ShareVector      : 0x1 ''  
    18.    +0x030 Mode             : 0 ( LevelSensitive )  
    19.    +0x034 ServiceCount     : 0  
    20.    +0x038 DispatchCount    : 0xffffffff  
    21.    +0x03c DispatchCode     : [106] 0x56535554  


     

    3.0: kd> !ioapic,运行后显示

    [plain] view plaincopy
     
    1. 0: kd> !ioapic  
    2. IoApic @ FEC00000  ID:8 (20)  Arb:170020  
    3. Inti00.: 52000000`000100ff  Vec:FF  FixedDel  Ph:52000000      edg high      m  
    4. Inti01.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
    5. Inti02.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    6. Inti03.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    7. Inti04.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    8. Inti05.: 52c00000`000100ff  Vec:FF  FixedDel  Ph:52C00000      edg high      m  
    9. Inti06.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
    10. Inti07.: 02000000`000100ff  Vec:FF  FixedDel  Ph:02000000      edg high      m  
    11. Inti08.: 01000000`000008d1  Vec:D1  FixedDel  Lg:01000000      edg high         
    12. Inti09.: 03000000`0000d9b1  Vec:B1  LowestDl  Lg:03000000-Pend lvl high rirr    
    13. Inti0A.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
    14. Inti0B.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    15. Inti0C.: 42000000`000100ff  Vec:FF  FixedDel  Ph:42000000      edg high      m  
    16. Inti0D.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    17. Inti0E.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    18. Inti0F.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    19. Inti10.: 03000000`0000f983  Vec:83  LowestDl  Lg:03000000-Pend lvl low  rirr    
    20. Inti11.: 00000000`000100ff  Vec:FF  FixedDel  Ph:00000000      edg high      m  
    21. Inti12.: 03000000`0000a994  Vec:94  LowestDl  Lg:03000000      lvl low          
    22. Inti13.: 00c00000`000100ff  Vec:FF  FixedDel  Ph:00C00000      edg high      m  
    23. Inti14.: 03000000`0000a973  Vec:73  LowestDl  Lg:03000000      lvl low          
    24. Inti15.: 03000000`0000a963  Vec:63  LowestDl  Lg:03000000      lvl low          
    25. Inti16.: 03000000`0000a9a4  Vec:A4  LowestDl  Lg:03000000      lvl low          
    26. Inti17.: 03000000`0000f9b4  Vec:B4  LowestDl  Lg:03000000-Pend lvl low  rirr    


     

    4.0: kd> !pic ,运行后显示

    [plain] view plaincopy
     
    1. 0: kd> !pic  
    2. ----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F  
    3. Physically in service:  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
    4. Physically masked:      Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  
    5. Physically requested:   Y  .  .  Y  .  Y  .  .  Y  Y  Y  Y  .  .  .  .  


     

    5.0: kd> !apic,运行后显示

    [plain] view plaincopy
     
    1. 0: kd> !apic  
    2. Apic @ fffe0000  ID:0 (50014)  LogDesc:01000000  DestFmt:ffffffff  TPR FF  
    3. TimeCnt: 0fdad680clk  SpurVec:1f  FaultVec:e3  error:40  
    4. Ipi Cmd: 02000000`000008e1  Vec:E1  FixedDel  Lg:02000000      edg high         
    5. Timer..: 00000000`000300fd  Vec:FD  FixedDel    Dest=Self      edg high      m  
    6. Linti0.: 00000000`0001001f  Vec:1F  FixedDel    Dest=Self      edg high      m  
    7. Linti1.: 00000000`000084ff  Vec:FF  NMI         Dest=Self      lvl high         
    8. TMR: 63, 73, 83, 94, A4, B1, B4  
    9. IRR: 41, B1, D1  
    10. ISR: D1  

     48、.cls

     .cls用于清屏

    注意:得在windbg处于命令行模式时才可用(即按了Ctro+Break)

     或者直接使用工具栏:

    二、

    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下用户态断点。

  • 相关阅读:
    Linux/UNIX编程:实现简单 tee 命令
    Java原子变量类需要注意的问题
    一种很有意思的数据结构:Bitmap
    Java实现简单井字棋
    分治算法学习
    使用栈实现表达式求值
    Web安全学习笔记——SQL注入
    【old】Python学习笔记
    函数1
    pycharm(Tip of Day)
  • 原文地址:https://www.cnblogs.com/decode1234/p/7509138.html
Copyright © 2020-2023  润新知