Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Delphi中更好的多线程调试_Multithreading_Delphi_Debugging_Ide_Delphi 2007 - Fatal编程技术网

Multithreading Delphi中更好的多线程调试

Multithreading Delphi中更好的多线程调试,multithreading,delphi,debugging,ide,delphi-2007,Multithreading,Delphi,Debugging,Ide,Delphi 2007,从对DelphiIDE中bug的另一个问题的回答开始,是否有人知道是否有办法改进IDE的多线程调试功能,或者如果没有,至少知道为什么有时候会如此糟糕 当一个程序中有多个线程时,使用F7或F8单步执行代码通常会导致很长的暂停,或者整个IDE都会被锁定。当您离开或输入方法或过程时,这一点尤其明显。对于单线程应用程序,调试器似乎总是很好的 另外,我使用的版本是2007,是的,调试多线程应用程序很麻烦。因为您经常从一个线程切换到另一个线程。根据我的经验,使用Vista和Delphi 2009进行多线程调

从对DelphiIDE中bug的另一个问题的回答开始,是否有人知道是否有办法改进IDE的多线程调试功能,或者如果没有,至少知道为什么有时候会如此糟糕

当一个程序中有多个线程时,使用F7或F8单步执行代码通常会导致很长的暂停,或者整个IDE都会被锁定。当您离开或输入方法或过程时,这一点尤其明显。对于单线程应用程序,调试器似乎总是很好的


另外,我使用的版本是2007,是的,调试多线程应用程序很麻烦。因为您经常从一个线程切换到另一个线程。

根据我的经验,使用Vista和Delphi 2009进行多线程调试要比使用Delphi 2007进行XP好得多

首先,ide要稳定得多

其次,在vista上的Delphi2009中,调试器可以向您显示死锁发生的位置


如果您必须使用Delphi2007,我强烈建议您尽可能在单线程单元测试中调试代码,然后在主程序中使用您现在已经测试过的代码。;)

当应用程序本身没有死锁时,试着非常清楚您处于哪个线程中。将线程列表保持在调试器中,并考虑使用命名线程。


有时,不可能以交互方式调试自身死锁的应用程序。发生这种情况时,您可以使用WinDbg和Adplus等工具来处理内存转储。是的,这比使用交互式调试器要困难得多,但总比没有调试器好。Tess Ferrandez的博客上有一些示例应用程序、演示和说明。我会先说。实验室是以.NET为中心的,但不要让它把你拒之门外;想法是一样的。

当我想要调试一个多线程操作时,我经常使用一个日志文件(在应用程序运行后我分析该文件),而不是交互式调试器

例如,使用函数“OutputDebugString”。输出在Delphi的事件日志中。如果在Delphi之外启动程序,可以使用来显示日志。注意将线程ID添加到每个输出(GetCurrentThreadID)。
请注意,在写入日志之前可能会有线程切换。但是在多个线程交互的地方,您可能会有一个关键会话(或另一个同步对象),因此它应该是一个问题。

另一个我从未尝试过的想法,因为我刚刚考虑过:如果您对调试一个线程感兴趣,只是想避免被其他线程干扰,可能暂时挂起一些线程


提供挂起和恢复线程的可能性(在进程属性中名为“线程”的选项卡中)。但正如我所说,我直到现在才对它进行过测试。

第二点:如果调试器没有响应,这没有多大帮助,因为错误在IDE中,而不是在调试的代码中。德尔福2009在这方面真的更好吗?在调试线程时F7是否每次都有效?最后一点:当您试图在线程之间的交互中发现问题时,这没有帮助。这是IDE应该坚如磐石的东西,否则它就不是一个专业工具。更不用说远程调试的噩梦了……好吧,我在Delphi2009中编写了一个任务池,其中包含了一些相当广泛的调试,并且没有任何锁定。我现在写的多线程代码也不一样了,这可能就是原因。我会在一些代码上尝试D2009试用版,看看它是否适合您!另外,关于第二点。如果你安装了亚洲字体,Windows XP会在文本绘制中有一些全局锁定,如果你运气不好,这会让操作系统慢下来。Vista修复了使升级成为我的一大幸事的问题,但他似乎没有这个问题