• Windbg 命令 (四)


    断言处理 ah

    1. ahb [Address] // 指定地址的断言如果失败则中断调试器
    2. ahi [Address] // 忽略指定地址断言的失败
    3. ahd [Address] // 删除指定地址的断言信息
    4. ahc // 删除进程的断言信息
    5. ah // 显示当前的断言处理设置

    对于断言也是系统的一个exception(STATUS_ASSERTION_EXCEPTION)。因此该命令只是设置指定位置断言的处理状态。而sx* asrt命令可以设置全局的断言处理状态。

    访问断点 ba

    访问断点有些地方也被称为数据断点。创建一个处理器断点,会在访问指定地址时中断。

    1. ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
    2. // example
    3. 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

    1. // 给指定指令地址设置断点
    2. bp[ID] [Options] [Address [Passes]] ["CommandString"]
    3. // 给指定地址设置断点,允许当前module symbol不存在
    4. bu[ID] [Options] [Address [Passes]] ["CommandString"]
    5. // 允许使用通配符*来批量设置断点。
    6. bm [Options] SymbolPattern [Passes] ["CommandString"]
    7. // 列出当前存在的断点
    8. bl [/L] [Breakpoints]
    9. // Disable断点
    10. bd Breakpoints
    11. // Enable断点
    12. be Breakpoints
    13. // 删除断点
    14. bc Breakpoints
    15. // 给指定断点重新编号
    16. br OldID NewID [OldID2 NewID2 ...]
    17. // 更新指定断点所指定的命令
    18. bs ID ["CommandString"]
    19. // 更新指定条件断点的条件和命令
    20. bsc ID Condition ["CommandString"]

    对于windbg里面所操作的断点都是采用ID来编号,例如

    1. 0:007> bl
    2. 0 e Disable Clear 00007ff8`093e52f0 0001 (0001) 0:**** ntdll!RtlInitAnsiString
    3. 1 e Disable Clear 00007ff8`094e30f0 0001 (0001) 0:**** ntdll!RtlSetTimer
    4. 2 e Disable Clear 00007ff8`094ee420 0001 (0001) 0:**** ntdll!RtlNtdllName

    一旦通过bp等命令设置断点之后,可以使用be, bd, bc等命令来通过对应的ID来操作。

    断点地址也可以指定为。bl命令会把所有命令都列出来,但是不会表明断点的类型,需要使用.bpcmds命令来显示每个断点的类型

    1. 0:007> .bpcmds
    2. bp0 0x00007ff8`093e52f0 ;
    3. bp1 0x00007ff8`094e30f0 ;
    4. bp2 0x00007ff8`094ee420 ;
    5. bu4 @!"ntdll!fltused";

    对比内存 c

    1. c Range Address
    2. // 例子
    3. 0:007> c 0x00007ff8`094ee426 L3 0x00007ff8`094ee42a
    4. 00007ff8`094ee426 00 - 00007ff8`094ee42a 1a
    5. 00007ff8`094ee428 18 - 00007ff8`094ee42c 00

    可以对比两端内存的差异,并列列出不同的内容。如例中所示其中长度指定的3,但是输出只列出了两个有差异的字节。

    显示内存 d, da, db, dc, dd, dD, df, dp, dq, du, dw, ds, dS, 

    1. d{a|b|c|d|D|f|p|q|u|w|W} [Options] [Range]
    2. dy{b|d} [Options] [Range]
    3. d [Options] [Range]

    这一系列命令都可以看作d+显示格式。其中又能分为两类,以不同格式显示binary内容和显示显示成字符或者字符串内容。du, da, ds, dS就能够显示字符和字符串内容。需要注意的是ds和dS现实的是结构体STRING, ANSI_STRING, or UNICODE_STRING。而单纯显示字符串则使用du,da。

    1. 0:007> da 00007ff8`094ee430
    2. 00007ff8`094ee430 "HDP..."
    3. 0:007> dd 00007ff8`094ee430
    4. 00007ff8`094ee430 09504448 00007ff8 00480046 00000000
    5. // ds,dS如果接受的不是一个正确的结构体,则会显示异常
    6. 0:007> ds 00007ff8`094ee430
    7. 00000000`00480046 "????????????????????????????????"

    显示指针指向的内容 dda, ddp, ddu, dpa, dpp, dpu, dqa, dqp, dqu

    针对一些指针数组之类的场景,我们希望批量显示指针指向的内容,而不是指针本身的值。这时候就需要使用dd*和dp系列的命令。先看例子

    1. 0:007> da 0x000000f8`0d1ffb78
    2. 000000f8`0d1ffb78 ".&B..."
    3. 0:007> dpa 0x000000f8`0d1ffb78
    4. 000000f8`0d1ffb78 00007ff8`094226a1 ". H..I....Q)."
    5. 0:007> da 0x00007ff8`094226a1
    6. 00007ff8`094226a1 ". H..I....Q)."

    如例子所示,dpa将指定的地址当作一个指针加以解释,并且将其按照asiic字符进行显示。当然其效果也等于第三个命令,直接指定指针中的地址。

  • 相关阅读:
    display、visibility、opacity的区别
    cpu设计和实现(iverilog工具)
    时序预测 | MATLAB实现MLP多层感知机时间序列预测
    小白学爬虫:通过关键词搜索1688商品列表数据接口|1688商品列表数据接口|1688商品列表数据采集|1688API接口
    Mysql之Using index for skip scan
    Spring复习之——IoC和AOP
    crontab定时删除日志文件
    java计算机毕业设计springboot+vue度假山庄酒店管理系统(源码+系统+mysql数据库+Lw文档)
    ksm页面合并的并发处理
    利用gpt进行GMV变化数据分析
  • 原文地址:https://blog.csdn.net/wupeng4389151/article/details/126999779