从答案到另一个关于Delphi IDE中的错误的问题,有没有人知道是否有办法改进IDE的多线程调试功能,或者如果没有,至少为什么它如此糟糕?场合?
如果程序中有多个线程,使用F7或F8逐步执行代码通常会导致非常长的暂停,或者整个IDE只会锁定。当您离开或输入方法或程序时,这一点尤为明显。对于单线程应用程序,调试器似乎总是很好。
PS。我正在使用的版本是2007
答案 0 :(得分:3)
根据我的经验,使用Vista和Delphi 2009的多线程调试比使用Delphi 2007的XP要好得多。
首先,ide更加稳定。
其次,在vista上的Delphi 2009中,调试器可以向您显示死锁发生的位置。
如果您必须使用Delphi 2007,我强烈建议您尽可能在单线程单元测试中调试代码,然后在主程序中使用现在经过测试的代码。 ;)
答案 1 :(得分:2)
当应用程序本身没有死锁时,请尝试非常了解您所在的线程。将线程列表保留在调试器中,并考虑使用命名线程。
有时候交互式调试本身死锁的应用程序是不可能的。发生这种情况时,您可以使用WinDbg和Adplus等工具来处理内存转储。是的,这比使用交互式调试器要困难得多,但它根本没有调试器。在Tess Ferrandez的博客上有示例应用程序,演示和说明。我会从this page开始。实验室以.NET为中心,但不要让它让你远离;这些想法是一样的。
答案 2 :(得分:1)
当我想调试多线程操作时,我经常使用日志文件(我在应用程序运行后分析)而不是交互式调试器。
例如使用函数'OutputDebugString'。输出来自Delphi的事件日志。如果在Delphi之外启动程序,可以使用DebugView from SysInternals显示日志。注意将Thread-ID添加到每个输出(GetCurrentThreadID)。 请注意,在写入日志之前可能会有一个线程切换。但是在多个线程交互的地方,你可能会有一个关键会话(或另一个同步对象),因此它应该是一个问题。
答案 3 :(得分:0)
是的,调试多线程应用程序很麻烦。因为你经常从一个线程交换到另一个线程。
答案 4 :(得分:0)
我从未尝试过的另一个想法,因为我刚刚想过它:如果你对调试一个线程感兴趣并且只是想避免受到其他线程的干扰,那么暂时可以暂停一些线程。 / p>
Process Explorer from SysInternals提供了暂停和恢复线程的可能性(在进程属性中名为“Threads”的选项卡中)。但正如我所说,我从未测试过它。