【问题标题】:How to keep breakpoints between sessions using cdb (windbg command line)?如何使用 cdb(windbg 命令行)在会话之间保留断点?
【发布时间】:2020-03-23 19:58:27
【问题描述】:

我的目标是在 CDB(windbg 的命令行版本)中的调试会话之间保留断点。我可以使用.restart 正确重启,但是我总是丢失断点(我正在使用bu 和/或bm 命令设置断点。

仅使用 cdb 是否有可能?

【问题讨论】:

    标签: windows debugging windbg cdb


    【解决方案1】:

    cdb 不能在 .restart 之前使用 .bpcmds 并保存到某个地方并在重启后重新使用它

    对于windbg,您可以使用工作区来保存会话之间的断点

    编辑演示

    假设你有这些断点

    0:000> bl
     0 e 00007ff6`0fc4109c     0001 (0001)  0:**** calc!wWinMain
     1 e 00007ff6`0fc41820     0001 (0001)  0:**** calc!wWinMainCRTStartup
     2 e 00007ff6`0fc41960     0001 (0001)  0:**** calc!matherr
     3 e 00007ffb`f033d880     0001 (0001)  0:**** ntdll!NtCreateTimer2
     4 e 00007ffb`f033d6a0     0001 (0001)  0:**** ntdll!NtCreateNamedPipeFile
     5 e 00007ffb`f02a2000     0001 (0001)  0:**** ntdll!RtlDefaultNpAcl+0x190
     6 e 00007ffb`ede53000     0001 (0001)  0:**** KERNELBASE!EnumDynamicTimeZoneInformation+0x60
    

    .bpcmds 将向您展示如何设置它们(最后两个是基于 rva 的无符号 bps)

    如果您使用 bp 设置它们,下次它们可能无法正常工作
    由于 ASLR,因为模块可能会在不同的地址加载

    0:000> .bpcmds
    bu0 calc!wWinMain;
    bu1 calc!wWinMainCRTStartup;
    bu2 calc!wsetargv;
    bu3 ntdll!ZwCreateTimer2;
    bu4 ntdll!ZwCreateNamedPipeFile;
    bu5 ntdll+2000;
    bu6 kernelbase+3000;
    0:000>  
    

    复制粘贴到一些暂存空间并在.restart 之后复制粘贴回 cdb 控制台

    您也可以使用 .logopen {some_path_to_some_textfile} 执行 .bpcmds 和 .restart

    在这种情况下,您可以从日志文件中复制粘贴 bps,而不必再次打开日志文件,因为 windbg/cdb 不会在重新启动时关闭日志文件

    这里 .restart 也被捕获到日志文件中

    bu6 kernelbase+3000;
    0:000> .restart
    CommandLine: calc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多