【问题标题】:Delphi: how to exclude units from debugger?Delphi:如何从调试器中排除单元?
【发布时间】:2010-11-05 16:04:57
【问题描述】:

有时,当我在一步一步调试时,就在 FormCreate 事件之前或 FromDestroy 之后,调试器开始打开 ​​DevExpress 单元(cxContainer.pas,...),所以在 FormCreate 之前,我的“F8”引导我到 cxContainer 而不是进入我的代码的下一行。

(这只是一个示例,当然可以在任何 3rd 方库中发生)

如何告诉调试器“只调试我的单元”(只调试 dpr 文件中列出的 pas 文件?)

当然有时调试库很有用,但在大多数情况下却不是。

【问题讨论】:

标签: delphi debugging delphi-2009


【解决方案1】:

您的第三方组件最好遵循 VCL 约定:

  • 将所有第三方包中的 DCU 输出路径更改为与您存储 PAS 文件的文件夹不同的文件夹。
  • 在 Debug 模式下编译每个包一次,并将生成的 DCU 文件保存在一个文件夹中(例如 Debug DCUs)。
  • 再次编译每个包,但这次是在发布模式下,并将生成的 DCU 文件保存在一个文件夹中(例如发布 DCU)。
  • 转到 Delphi 选项并将发布 DCU 的路径添加到“库路径”。
  • 在 Delphi 选项中,将源文件的路径添加到“浏览路径”中。
  • 在 Delphi 选项中,将调试 DCU 的路径添加到“调试 DCU 路径”。

这样,Delphi 只会在您编译项目时看到该第三方组件的发布 DCU,因此调试器无法单步执行源代码。 另一方面,由于源路径包含在“浏览路径”中,您仍然可以通过 Ctrl+单击单元名称或在这些单元中定义的任何内容导航到 IDE 中的源代码。

如果要调试组件,可以进入“项目|选项|Delphi编译器|编译”,并启用“使用调试.dcus”。这将强制编译器使用“调试 DCU 路径”而不是“库路径”。

VCL 的工作原理是一样的,一般你在调试项目时不会单步进入 VCL 源代码,但是如果你启用“使用调试 .dcus”,你也可以调试 VCL 源代码。

JVCL 也以同样的方式组织它的包和源代码。

编辑: 如果您采用这种方法,并且希望代码浏览(Ctrl+Click)正常工作;请注意,在编译发布版本的包时,必须将“项目|选项|德尔福编译器|编译”中的符号参考信息设置为“参考信息”;否则,Ctrl+Click 不适用于这些单位。默认情况下,Release 构建配置将 Symbol Reference Info 设置为 None。

【讨论】:

  • +1 非常全面的答案。我学会了一个知道的把戏。已经看到调试 dcu 路径,但它没有“点击”wrt 如何充分利用它。感谢那。我看到的只有一个缺点:“使用调试 dcu”现在意味着当您通常只有一个要调试的库时,您将对所有库使用调试 dcu。在这种情况下,只需将库路径更改为仅指向该库的调试 dcu 文件夹通常会更方便...
  • 您可能期望过去 10 年使用 Delphi 的开发人员知道这一点,但我不知道。 额头>
【解决方案2】:

一个快速简单的解决方案是禁用您正在使用的任何库的调试开关 ({$D-})。许多库(包括 DevExpress)使用全局包含文件,通常位于每个源文件的顶部,或者在“单元”语句的正上方或下方(例如 unit cxContainer; {$I cxVer.inc} interface )。打开该包含文件(单击它并按 CTRL-Enter)并在顶部添加 {$D-},并注释掉任何现有的 {$D+}。

【讨论】:

    【解决方案3】:

    只有一种方法可以告诉编译器不要调试一个单元:在没有调试信息的情况下编译它。

    如果您有库的源代码,您可以在关闭库中每个包的“包含调试信息”编译器选项后重新构建它们的包。如果幸运的话,您的库将包含一个 .inc 文件,该文件指定了它们需要的编译器选项以及它们包含在每个单元中的选项。在这种情况下,您所要做的就是编辑这个 inc 文件并重建所有包。

    如果您没有库的源代码,则库制造商可能提供了两组 dcu:一组编译时使用,另一组没有调试信息。在这种情况下,只需将您的库路径指向您需要的路径即可。

    【讨论】:

      【解决方案4】:

      在您不希望调试器进入的单元中关闭调试信息。

      【讨论】:

      • 添加以防止其他人像我刚才那样查找此内容:这可以通过您不想调试的单元中的 {$D-} 编译器指令来完成。
      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多