每次我执行
.restart
(因为我不小心按了太多次 F10),WinDBG 都会清除我所有的断点。在重新启动被调试程序时保留这些断点是否可能?.restart
(因为我不小心按了太多次 F10),WinDBG 都会清除我所有的断点。在重新启动被调试程序时保留这些断点是否可能?bu
而非bp
来设置断点,那么它们就会被保存在工作区中。因此,请使用bu
来设置断点,然后保存工作区,这样就可以实现目的了。bu
)。请参见此处(最后一段):https://msdn.microsoft.com/en-us/library/windows/hardware/ff560012(v=vs.85).aspx 您可以使用.bpcmds
进行验证,该命令显示用于设置当前断点的命令。 - conio这需要在路径中安装awk,我通常在我的设置中都会有
如果是windbg、cdb或者kd,将会起作用,不必记住对问题的回答是“是”还是“否”
0:000> .shell -ci "bl" awk "{print \"bp \" $7}" >> c:\breaks.txt
.shell: Process exited
0:000> .restart
CommandLine: C:\Windows\System32\calc.exe
774e04f6 cc int 3
0:000> bl
0:000> $$>a< c:\breaks.txt
0:000> bl
0 e 00fb1635 0001 (0001) 0:**** calc!WinMain
1 e 75eaea11 0001 (0001) 0:**** USER32!MessageBoxA
2 e 774855c8 0001 (0001) 0:**** ntdll!NtCreateFile
如果没有地址空间随机化(ASLR),保存命令历史记录可以帮助您以完整的方式重新启动会话。
.write_cmd_hist c:\foo.txt
编辑
我刚刚检查了一下,点击历史记录不是命令历史记录的一部分,无论是按下 F9键
还是在windbg中单击 手形图标
都不会提供历史事件。
0:000> bl
0 e 00a11022 0001 (0001) 0:**** helloworld!main+0x22
1 e 00a11016 0001 (0001) 0:**** helloworld!main+0x16
0:000> .bpcmds
bu0 @@masm(`helloworld!c:\test\helloworld\helloworld.cpp:6+`);
bu1 @@masm(`helloworld!c:\test\helloworld\helloworld.cpp:5+`);
windbg> .write_cmd_hist c:\foo.txt
Wrote command history to 'c:\foo.txt'
0:000> .shell - type c:\foo.txt
Unknown option ' '
.write_cmd_hist c:\foo.txt
.bpcmds
bl
.cls
t <----- neither f8 ,f10 nor f5 gets recorded in the history
.echo foo
g helloworld!main
.shell: Process exited
Press ENTER to continue
<.shell waiting 1 second(s) for process>
<.shell process may need input>
.write_cmd_hist
对通过点击源代码行设置的断点有任何作用吗?我没有输入任何命令来设置这样的断点,我只是点击适当的源代码行。 - Billy ONeal.shell
在目标机器上运行。我们需要在所有调试的机器上都安装awk
吗?WinDbg中有一个内置的解决方案。仅仅为了重新发明轮子而重新发明轮子似乎是没有必要的。 - conio
bu
断点但不保存bp
断点,因此解决方案是使用bu
并保存工作区。 - conio