如何最佳地使用 Delphi IDE 和/或 FOSS 进行调试?

3
我看到以下用于调试的方法,想知道是否还有其他方法或者小公司可以使用哪些开源工具(我们不做太多的Windows编程)。
1. 在IDE中设置断点、使用监视等来进行调试。 2. 在IDE中使用事件日志进行调试。我从this page中获取了一些好的信息,并进行了修改,添加了时间戳和程序调用/返回时的缩进/取消缩进,以便更快地查看嵌套调用。是否有更好的方法呢? 3. 使用性能分析器。 4. 还有其他的吗?例如MadExcept等。
(我目前正在使用Delphi 7)

2
你想要实现什么,遇到了什么问题? - David Heffernan
+1 任何工具都可以。我正在寻找一整套 Delphi 调试工具(或方法)。 - Mawg says reinstate Monica
6个回答

5

Delphi集成调试器在Delphi 7中已经足够强大,可以处理大多数调试任务。它还可以远程调试应用程序。无论如何,有时您可能需要跟踪不同类型的问题:

  1. 为了检查内存泄漏,您可以切换到像FastMM4这样具有良好内存泄漏报告的内存管理器。像AQTime这样的分析工具也有内存分配分析工具,可以识别此类问题。
  2. 要调查性能问题,您需要一个性能分析器。有采样分析器(不太侵入式,尽管可能不太精确)和标准分析器(再次是AQTime,不便宜但非常好,以及其他工具)。
  3. 要跟踪异常,特别是在已部署的应用程序上,您可能需要使用JCL/JVCL(免费)、MadExcept或EurekaLog或SmartInspect等工具。
  4. 要获取应用程序执行情况的日志,您可以使用OutputDebugString()和IDE事件查看器,或DebugView独立应用程序。还有专用工具,如SmartInspect。
  5. 您还可以转换Delphi 7 .map文件为.dbg文件,并使用外部调试器(如WinSDK WinDbg),并在ProcessExplorer等工具中查看应用程序调用。
一些调试工具可能还提供代码覆盖率检查(哪些代码实际执行了,哪些没有)、平台兼容性检查(检查特定平台是否支持API调用)、资源使用情况等功能,但对于较大的开发项目可能会更有用。

2
map2dbg 在新的 .map 文件上不总是有效,也无法与 ProcessExplorer 一起使用,而 .dbg 文件已不再受 Microsoft 支持。因此,我使用(自己的;-) http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer 代替。 - André
1
他至少可以解释一下为什么要给负评。谢谢,David。 - user160694

3

Delphi 7的IDE非常适合入门,只有在遇到无法用现有工具解决的问题时才考虑第三方工具:

  • 它的错误信息很有意义,而且不会过于冗长。
  • 调试器非常好用,你有很多选项来检查变量、断点、条件断点、数据断点、地址断点和模块加载断点。它的调用堆栈视图很好,还支持多线程调试。
  • 良好的逐步执行,进入、跳过、运行直到返回等等。

第三方工具在你需要诊断客户端电脑上的问题时很有帮助(客户端电脑上没有Delphi IDE)。如果你能在自己的计算机上重现这个问题,你就可以只用IDE,不需要任何额外的免费或付费工具。

  • 性能分析器:这不是一个调试工具。当你需要找到应用程序中的瓶颈或进行一些速度优化时,你使用性能分析器。
  • 日志记录第三方框架:好的框架并不便宜,而且即使没有工具,你也可以进行最小限度的日志记录(甚至ShowMessage有时也可以用)。
  • MadExcept,其他记录异常的工具:它们通常需要调试信息存在于EXE中,这并不是一个好主意,因为它会使程序变慢,并且更容易被黑客攻击。同样,如果你能在自己的计算机上获得异常,你就不需要记录器。

我并不是说第三方调试工具没有用处:它们有用,但我会等到我能清楚地看到任何工具的好处,然后再决定是否使用它。在我看来,没有所谓的免费软件:即使你不付费,也需要时间学习如何使用它,并对你的程序和工作流程进行更改。


1
+1 从你之前的问题看,我认为你最受益的是熟悉目前内置在 D7 中的出色调试工具。 - David Heffernan
我认为性能分析器是一种调试工具。如果您将错误定义为“不正确的程序执行”,那么程序在执行操作时花费的时间明显超过应该花费的时间,这绝对算作一个错误。 - Mason Wheeler
1
回复:Madexcept不是一个好主意。Madexcept真的帮助我获得强大、可靠的代码,并快速识别远程站点问题。我的客户更看重这一点,而不是代码速度或可操作性。你的情况可能有所不同。 - Roddy

3

对于更大的工作,可以使用AQTime。

针对特定代码的较便宜解决方案是通过Free Pascal运行它(启用“随机化本地变量选项”),然后通过valgrind运行它。我已经通过这种方式验证了我的大部分流媒体代码(其中包含大量向后兼容结构)。

另一个有趣的开关是-CR,验证对象方法调用。它基本上会检查每个

TXXX(something).callsomething 

转换为

if something is txx then 
   TXXX(something).callsomething 
else
   raise some exception;

特别是在具有复杂树结构的代码中,这可以提供一些宝贵的信息。

正常的Pascal语言检查(范围、I/O、溢出、堆栈等,也称为-Criot)也很有用,并且在Delphi中也可用。

某些范围检查错误(通常是循环边界),可以在(beta)FPC 3.0.x+中静态检测,将导致编译错误。


AQtime的专业版相比于Delphi自带的版本实际上是更好的选择。尽管SmartBear最近推出了奇怪的许可模式,以及AQtime在每个新的Windows版本中都会产生新问题的良好传统,但它仍然是一款不错且值得推荐的工具。 - JensG
更新了评论,加入了一些最近的信息。 - Marco van de Voort

2
您可以尝试我的(开源)采样分析器的“进程堆栈查看器”: http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer (需要一些调试信息:.map或.jdbg文件)
您可以查看所有线程的堆栈(包括原始堆栈,可能有“误报”,但在无法进行常规堆栈遍历时非常有用),并进行一些简单的采样分析。
注意:我的(旧版)插桩分析器可以进行精确分析,也在同一网站上。

1

不确定为什么您想要升级以调试问题。是的,新的IDE提供了更多功能来帮助您调试某些内容,但考虑到您之前关于如何在程序挂起时调试程序的问题,我更愿意建议使用像CodeSiteSmartInspect这样的良好日志记录解决方案。它们提供比基于事件日志的自制解决方案更多的灵活性和功能,并且不需要您像IDE一样逐步执行代码(这会影响多线程问题的时间)。

更新

抱歉,没有理解FOSS代表免费和开源软件。CodeSite和SmartInspect都不是。对于免费解决方案,您可以查看Jedi工具系列中的日志记录功能。


+1 我已经删除了关于升级的部分;我认为这可能有所帮助(他们肯定不会每次发布都为IDE制作一个“更好”的GUI吧?),但是当它不经常使用时,1000美元以上的价格有点太高了。 - Mawg says reinstate Monica
不用担心不是FOSS。我会检查它们,如果它们看起来足够好而且价格不超过1000美元,那么我可能会考虑它们是一个不错的投资。 - Mawg says reinstate Monica
+1 是的,看起来不错,但是 $349?嗯,也许……只是我不太用 Delphi,但如果它可以为我节省价值 $349 的时间,那就值得了。 - Mawg says reinstate Monica
@LeonixSolutions:我不会没有一个好的日志记录解决方案。无论是在我的雇主的项目中还是在我自己的项目中(我自己承担费用)...你花费$349的时间编写的任何代码都无法接近它的价值,而且从长远来看,它将为您节省大量的调试时间(当然,前提是您发送合理的日志消息)。 - Marjan Venema
Jedi JCL Debug是一种很好的选择,适用于那些不想使用非开源软件MadExcept的用户。我真心热爱MadExcept,并且我也是JCL开发人员,所以我不能说哪一个更好,只能说我两个都在使用,并且在不同的情况下使用它们。 - Warren P
@Warren:当然,没有MadExcept也活不下去...但是,MadExcept仅在出现异常时才有帮助。而且,在没有异常的情况下,需要更频繁地进行调试。此外,一个好的日志记录库将允许您记录由例如MadExcept产生的堆栈跟踪,增加两者的效益。 - Marjan Venema

1

Rad Studio XE 包括 CodeSite 的轻量版和 AQTime,两者结合起来是非常有吸引力的改进。

你可以使用 JCL Debug、MadExcept 和其他分析和日志记录工具,但对于它们各自的任务来说,CodeSite 和 AQTime 是最好的两个。


2
从D7升级意味着需要购买新的Delphi完整许可证,因为有了新的升级政策,这可能比购买AQTime和CodeSite更昂贵(取决于所需的SKU),同时还需要将现有应用程序转换为Unicode,这可能会根据应用程序代码的复杂程度而有所不同。如果使用了任何商业第三方库,它们也可能需要进行升级。 - user160694
对你们俩都点个赞。谢谢。但是,是的,当我不怎么使用Delphi时,$1k+有点太高了。不过,迟早我可能不得不冒险一试。 - Mawg says reinstate Monica
您可以随时下载免费试用版。 - Warren P
如果你仅仅是因为 AQTime 而购买,那么它可能比购买AQTime更昂贵。” - JensG

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