如何在不清除所有断点的情况下重新启动调试程序?

7
每次我执行 .restart (因为我不小心按了太多次 F10),WinDBG 都会清除我所有的断点。在重新启动被调试程序时保留这些断点是否可能?

保存工作区?它会存储断点吗? - magicandre1981
它保存bu断点但不保存bp断点,因此解决方案是使用bu并保存工作区。 - conio
我甚至不知道工作区是什么 :) - Billy ONeal
请查看此处:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff540116(v=vs.85).aspx 和这篇经典文章:http://blogs.msdn.com/b/ntdebugging/archive/2010/05/07/uncovering-how-workspaces-work-in-windbg.aspx - conio
第二个链接已经失效,可以使用这个存档版本代替:https://web.archive.org/web/20190112003614/https://blogs.msdn.microsoft.com/ntdebugging/2010/05/07/uncovering-how-workspaces-work-in-windbg/ - Eran Zimmerman Gonen
2个回答

7
如果您使用bu而非bp来设置断点,那么它们就会被保存在工作区中。因此,请使用bu来设置断点,然后保存工作区,这样就可以实现目的了。

我通过点击源代码行来设置断点。这使用bu还是bp? - Billy ONeal
这些是未解决的断点(bu)。请参见此处(最后一段):https://msdn.microsoft.com/en-us/library/windows/hardware/ff560012(v=vs.85).aspx 您可以使用.bpcmds进行验证,该命令显示用于设置当前断点的命令。 - conio

2

这需要在路径中安装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
似乎不是这种情况。 - blabb
远程调试怎么办?.shell在目标机器上运行。我们需要在所有调试的机器上都安装awk吗?WinDbg中有一个内置的解决方案。仅仅为了重新发明轮子而重新发明轮子似乎是没有必要的。 - conio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接