Delphi:如何从调试器中排除单元?

7
有时候我在逐步调试代码时,在FormCreate事件之前或FromDestroy事件之后,调试器开始打开DevExpress单元(如cxContainer.pas等),因此在FormCreate之前按下"F8"键会跳转到cxContainer而不是进入我的代码的下一行。
(这只是一个例子,当然也可能发生在任何第三方库中)
我该如何告诉调试器“仅调试我的单元”(即dpr文件中列出的pas文件)?
当然,有时候调试库是有用的,但在大多数情况下并非如此。

4个回答

28

对于第三方组件,最好遵循VCL惯例:

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

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

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

VCL的工作方式相同,通常在调试项目时不会跳转到VCL源代码,但如果启用“使用调试.dcus”,则也可以调试VCL源代码。

JVCL还以相同的方式组织其包和源代码。

编辑: 如果采用此方法,并希望代码浏览(Ctrl +单击)正常工作,请注意在编译包的发布版本时,必须将“项目|选项|Delphi编译器|编译”中的符号引用信息设置为“参考信息”;否则,对于那些单元,Ctrl +单击将无法工作。默认情况下,发布构建配置将符号引用信息设置为“无”。


非常全面的答案,我学到了一个新技巧。我曾经看到过调试dcu路径,但是对如何充分利用它没有"点"透。谢谢。我只看到一个缺点:"使用调试dcu"现在意味着您将在所有库中使用调试dcu,而您通常只有一个要调试的库。在这种情况下,更方便的做法是将库路径更改为仅指向该库的调试dcu文件夹... - Marjan Venema
“拍额头” 你可能会期望一个使用Delphi开发已有10年经验的开发者知道这个,但我却不知道。 - Lieven Keersmaekers

3

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


2

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

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

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


1

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


为了帮助其他人节省像我一样查找的时间,特此添加:在不想调试的单元中使用{$D-}编译器指令即可实现。 - RobertFrank

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