首页 > 解决方案 > 如何使用 cdb(windbg 命令行)在会话之间保留断点?

问题描述

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

仅使用 cdb 甚至可能吗?

标签: windowsdebuggingwindbgcdb

解决方案


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 上关闭日志文件

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

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

推荐阅读