如何在Delphi 6 IDE中保留大量的OutputDebugString()调用降级我的应用程序?

时间:2011-12-03 18:23:33

标签: delphi debugging logging outputdebugstring

这种情况不止一次发生在我身上,导致许多人失去了追逐幽灵的时间。通常,当我调试一些非常困难的与时序相关的代码时,我开始添加大量的OutputDebugString()调用,因此我可以很好地了解相关操作的顺序。问题是,Delphi 6 IDE似乎只能处理这种情况这么久。我将使用一个具体的例子,我只是为了避免一般性(尽可能多)。

我花了好几天调试我的线程间信号量锁定代码以及我的DirectShow时间戳计算代码,这导致了一些令人非常沮丧的问题。在消除了我能想到的每个错误之后,我仍然遇到Skype的问题,我的应用程序将音频发送给。{/ p>

在大约10秒钟之后,我在谈话和听到我的声音之间的延迟来自我用于测试的第二台PC上的Skype,呼叫的远端开始增长。在大约20-30秒时,延迟开始呈指数级增长,此时触发的代码我检查了一个关键部分是否持有时间过长。

幸运的是,它并没有太晚,并且在此之前经历过这一切,我决定停止无情地追踪并关闭大部分的OutputDebugString()。值得庆幸的是,我将大部分内容包装在条件编译器定义中,因此很容易做到。我这样做的那一刻问题就消失了,事实证明我的代码工作正常。

因此,当OutputDebugstring()流量超过某个阈值时,看起来Delphi 6 IDE开始陷入困境。也许只是向事件日志调试器窗格添加字符串的任务,该窗格包含所有OutputDebugString()报告。我不知道,但是当TMemo或类似控件开始包含太多字符串时,我在应用程序中看到了类似的问题。

那些人为了防止这种情况做了什么?有没有办法通过某种方法调用清除事件日志或至少是限制其大小的方法?另外,您通过条件定义,IDE插件或其他什么技术来应对这种情况?

4 个答案:

答案 0 :(得分:4)

在使用Delphi 2007之前,我遇到了类似的问题。在IDE中禁用事件查看,而是使用DebugView中的Sysinternals

答案 1 :(得分:2)

我几乎没有使用OutputDebugString。我发现很难分析IDE中的输出,并且需要额外的努力才能保留多组多次运行。

我真的更喜欢一个好的日志记录组件套件(CodeSite,SmartInspect),并且通常会记录到各种文件。例如,标准文件是“常规”,“调试”(我想从客户端安装中收集的标准调试信息),“配置”,“服务”,“客户端”。这些都被设置为“溢出”到一组编号的文件,这允许您通过简单地允许更多编号的文件来保留几个运行的日志。比较来自不同运行的日志信息变得更加容易。

在您描述的情况下,我将添加记录到单独日志文件的调试语句。例如“Trace”。使“跟踪”可用的代码在条件定义之间。这使它变得非常简单。

为了避免留在这些额外的调试语句中,我倾向于进行更改以打开“跟踪”日志而不从源代码控制中检出它。这样,构建服务器的编译器会在无意中留下的任何语句中抛出“标识符未定义”错误。如果我想保留这些额外的语句,我要么将它们更改为“调试”日志,要么将它们放在条件定义。

答案 2 :(得分:2)

我要做的第一件事就是确保问题是您认为的问题。自从我使用Delphi以来已经很长时间了,所以我不确定IDE的限制,但我有点怀疑事件日志会随着时间的推移而开始呈指数级下降,调试字符串的数量相同写在20-30秒的时间。由于某些原因,写入的调试字符串数量似乎越来越有可能随着时间的推移而增加,这可能表明应用程序控制流中的错误在禁用日志记录时并不明显。

为了确保我会尝试编写一个简单的应用程序,它只是在一个循环中运行,以大约100个块的形式写出调试字符串,并开始记录每个块所需的时间,并查看时间是否开始增加为显着超过20-30秒的时间。

如果确实确认这是问题 - 或者即使不是 - 那么我建议使用某种类型的日志库。当你将它用于大规模的日志转储时,OutputDebugString确实失去了它的有效性。即使您确实找到了重置或限制输出窗口的方法,您也会丢失所有这些日志记录数据。

答案 3 :(得分:1)

IDE Fix Pack进行了优化,以提高OutputDebugString的性能

  

IDE的调试日志视图也得到了优化。调试器现在   仅在IDE空闲时更新日志视图。这允许IDE   当数百个OutputDebugString消息或其他消息时保持响应   调试消息将写入调试日志视图。

请注意,这仅适用于Delphi 2007及更高版本。