如何使用 cdb(windbg 命令行)在会话之间保留断点?
How to keep breakpoints between sessions using cdb (windbg command line)?
我的目标是在 CDB(windbg 的命令行版本)中的调试会话之间保留断点。我可以使用 .restart
正确重启,但是我总是丢失断点(我使用 bu
and/or bm
命令设置断点。
仅使用 cdb 是否可行?
cdb 无法在 .restart 之前使用 .bpcmds 并保存到某个地方并在重启后重新使用它
对于 windbg,您可以使用 workspaces 来保存会话之间的断点
编辑演示
假设你有这些断点
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>
复制粘贴到某个地方 space 并在 .restart 之后复制粘贴回 cdb 控制台
您可以使用 .logopen {some_path_to_some_textfile} 执行 .bpcmds 和 .restart 也
在这种情况下,您可以从日志文件中复制粘贴 bps,而不必再次打开日志文件,因为 windbg/cdb 不会在 .restart 时关闭日志文件
这里是 .restart 也被捕获到日志文件
bu6 kernelbase+3000;
0:000> .restart
CommandLine: calc
我的目标是在 CDB(windbg 的命令行版本)中的调试会话之间保留断点。我可以使用 .restart
正确重启,但是我总是丢失断点(我使用 bu
and/or bm
命令设置断点。
仅使用 cdb 是否可行?
cdb 无法在 .restart 之前使用 .bpcmds 并保存到某个地方并在重启后重新使用它
对于 windbg,您可以使用 workspaces 来保存会话之间的断点
编辑演示
假设你有这些断点
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>
复制粘贴到某个地方 space 并在 .restart 之后复制粘贴回 cdb 控制台
您可以使用 .logopen {some_path_to_some_textfile} 执行 .bpcmds 和 .restart 也
在这种情况下,您可以从日志文件中复制粘贴 bps,而不必再次打开日志文件,因为 windbg/cdb 不会在 .restart 时关闭日志文件
这里是 .restart 也被捕获到日志文件
bu6 kernelbase+3000;
0:000> .restart
CommandLine: calc