Delphi:为什么断点不时可用(IDE上的绿色突出显示行)?

时间:2011-04-15 16:56:53

标签: delphi ide breakpoints delphi-xe

我有时会在Delphi中丢失断点功能。

我认为这是Delphi 2009问题,但现在我也在Delphi XE中使用它。

在Delphi 2009中,通过删除.dproj文件,我使断点再次起作用。

在Delphi XE中,我无法显示破坏点。我有更新1,所有修补程序都已应用。

有没有人有解决方案?

19 个答案:

答案 0 :(得分:47)

文件中不存在调试信息。

确保您使用的是Debug配置。 (Project Manager树,展开Build Configurations,确保Debug为粗体。如果不是,请右键单击Debug,然后从上下文菜单中选择Activate。确定你然后执行项目的构建,而不仅仅是编译

如果仍然无效,请从IDE的主菜单转到Project->Options,点击Compiling下的Delphi Compiler,然后查看右侧的Debugging部分窗户的一半。确保同时选中Debug InformationLocal Symbols。如果您正在尝试跟踪VCL自己的源代码,还要检查Use debug .dcus(您需要关闭它并在完成后立即完成项目的完整构建,因为它很烦人的时候你正常调试)。同样,你需要构建而不是编译。

如果上述所有方法都失败了,另一种可能性是您在代码编辑器中打开的代码单元与编译器看到的代码单元不同。确保您的计算机上没有该文件的多个副本,而该位置是编译器可能首先找到的位置。如果您不确定,请删除具有该单位名称的.dcu文件,然后对项目进行构建,并查看新创建的.dcu是否位于您期望的位置。

答案 1 :(得分:21)

我找到了更好的方法。

在项目管理器树中,右键单击项目,然后从弹出菜单中选择“清除”。

断点重新出现,这是一种非常快速的方法。

答案 2 :(得分:13)

我怀疑当您完成发布版本并禁用调试时会发生这种情况。然后切换回调试配置并进行编译而不是构建。您无法设置断点的文件对应于具有禁用调试的编译生成的DCU的文件。

简单地进行构建以重新生成所有DCU文件将使您的断点再次起作用。

答案 3 :(得分:5)

我和XE4有同样的问题。这就是我几个小时前发现这篇文章的原因。上述解决方案均不适合我。对我来说,正确的解决方案 - 到目前为止 - 是添加“远程调试符号”选项。奇怪,因为我不使用远程调试。无论如何它现在看起来还不错。

答案 4 :(得分:4)

这是代码未对齐与断点标记(装订线中的蓝色/红色“药片”)的另一个原因。

编辑器识别出三种不同的行尾,

  • CRLF(回车-换行对)
  • 仅CR
  • 仅低频

其中CRLF是编辑器中的默认设置。

然而,编译器似乎没有将CR only视为行尾,而仅将CRLFLF only视为行尾。因此,如果您的源文件恰好具有一个或多个CR only,则“蓝色药丸”将从源文件中偏移。

例如,您可能已经从源文件中获得了CR only EOL(行尾)字符。互联网。我记得MAC OS将CR only用作EOL。

要验证文件中的EOL,可以在编辑器中打开EOL的显示

( Tools - Options - Editor options - Source options - Show line breaks)

这些符号看起来很怪异(请参见下图),但对于CRLF,它们仅在L的C上,对于CR而言,在R的C上,对于LF则在F的L上。

以下图像显示了正常的EOL(CRLF)和EOLS,它们是我在十六进制编辑器中将CR only强制为一行并且将LF only强制为另一行之后的结果。如上所述,CR only使断点标记从源代码偏移。

正常CRLF的停产期:

enter image description here

一行CR only,另一行LF only

enter image description here

修复
要将所有EOL重置为CRLF,请取消选中Preserve line ends中的Editor Options

( Tools - Options - Editor options)

进行微不足道的更改,以便将该文件标记为已修改,关闭文件,将更改保存到XYZ.pas? ,然后重新打开。
现在所有行尾均为CRLF。重建项目,所有断点将位于正确的位置。

答案 5 :(得分:3)

打开远程调试符号为我做了(没有其他工作)。项目>选项>链接并检查包括远程调试符号。

答案 6 :(得分:2)

不工作断点的另一个原因可能是(经常用delphi5测试):
单元中的程序太多。
解决方案是将程序移至另一个单位

答案 7 :(得分:2)

我遇到了一个相关问题:我在特定文件中丢失了断点,但其他文件都没问题。发生的事情是我已经重命名了该文件,但我不知道旧文件的DCU仍然被使用,因为它在某个地方被“使用”条款引用。

解决方案是手动删除所有DCU(执行“干净”是不够的,因为DCU表示的旧文件不再在项目中)并重建。您将收到显示错误“使用”子句的编译错误。

答案 8 :(得分:1)

我也面临同样的问题,所以我来到这里。 除了David Heffernan解决方案,我在这里添加了一个图像。 就我而言,它非常简单。 在项目浏览器中,当我更改它时它是Release,它适用于我。 请看一下图片。 Make changes in Project explorer

由于 快乐的编码 伊克巴尔

答案 9 :(得分:1)

在delphi 7中,似乎存在设置断点的真正错误。

我有一个单位,其中许多文本在

中定义
  

const constname:record-type =(...)的数组[0..x];

接口部分中的

,其中record-type有一些AnsiString项。 在实施部分中有一些程序。

在某些特殊情况下,当我在一个过程中的任何地方设置一个断点时,delphi不会停止它!

备注:所有调试选项都设置正确(因为F7导致delphi停止在程序的“开始”,蓝点在整个单元中可见,线条在执行应用程序时保持红色)和所有DCU在我对整个项目进行完整构建之前,根据PAS文件从我的所有磁盘和所有文件夹中删除。所以没有wold文件应该随处可见。 为了进行测试,我将PAS重命名为另一个名称,以前从未使用过,并且肯定在任何磁盘上没有其他地方,然后调整所有源并重新编译,只是为了确保delphi和我正在查看相同的PAS文件 - 但断点也没用。

但还有另一个非常奇怪的事情发生了:文本consts(!)在我的可执行文件中更改(不在exe文件中,但显然在内存中)!在程序启动期间检查这些文本的正确性,有时它会抱怨错误!在消息框中显示文本显示,在该文本中更改了一个sinlge字符,定义为const。为了测试,我尝试在我的代码中为这些consts分配一些东西,但是,正如预期的那样,编译器抱怨,因此它不能是导致文本更改的普通赋值。必须是一个错误的指针。怪异。

因此,随后进行了数小时的测试,寻找可能设置错误指针的任何源代码,以后可能导致文本const中的更改。我将消息框放入我能够编辑的单元初始化链中的第一个单元的初始化部分,但更改的字符已经存在!必须在我的应用程序启动期间尽早更改,然后!

最后我想通了,我文本中出现的字符总是$ CC - 这正是INT 3的汇编代码,这是delphi用于设置断点的代码。当向上或向下移动该单位内的断点时,改变后的角色的位置也会向左或向右移动一些角色!并且错误移动的字符数仅与相关行所需的汇编编码字节的估计量相关。在彼此靠近的行中设置两个断点,突然两个字符改变了!从该单元中删除所有断点时,文本保持不变!

所以只有一个结论:delphi本身在尝试设置断点时改变了这些文本而没有这样做。我无法摆脱这个错误。关于重新同步delphi的源代码文件和目标代码文件的内部簿记的提示确实没有帮助我!

由于相关单元主要由多个{$ IFDEF}之间的{$ I}行组成,因为包括一些不同但长的pascal文本,我认为delphi在包含太长的内容或对条件编译器指令的评估方面存在问题。所以我删除了包含并将源文本立即放入单元中,并删除了{$ IFDEF} - 编译时没有错误,但设置断点也改变了我的文本常量,而不是停止执行。一切都一样!

我现在通过将单元拆分为两个单元来解决这个问题,一个单元只保留其界面部分中的文本,另一个单元用于保存程序。现在,在不更改任何编译器和链接器设置的情况下,所有断点都可以按预期工作,而不再更改文本!

所以,如果断点不适合你,虽然你确定它们应该,但是delphi可能是罪魁祸首并且无法在正确的位置设置断点。如果它只是改变一些文本,也许永远不会引起你的注意。分裂单位帮助了我,也许这对你有帮助。

答案 10 :(得分:1)

尝试对本地PC进行远程调试。

它为什么起作用:(source

  

在本地调试Delphi项目时,RAD Studio不使用RSM调试文件,因为编译器将符号表保存在内存中。但是,在远程调试Delphi项目时,必须生成一个包含这些符号表的RSM调试文件。否则,RAD Studio不会在您的断点处停止。

当然,您必须首先将项目的“链接”选项“映射文件”配置为“详细”,以生成* .rsm文件。有关入门的信息,请参见Overview of Remote Debugging

答案 11 :(得分:0)

就我而言,我在一个单元中设置了断点,这个单元在IDE中打开时不是当前活动项目的一部分。这样的断点也显示为绿色。我现在根本没出现在正确的页面上。

(我在尝试了以上所有内容后发现了这一点。)

答案 12 :(得分:0)

如果您尝试设置断点的文件是DLL的一部分,则需要通过在项目管理器中双击它来激活该DLL,使其变为粗体,然后构建它。然后,蓝色圆圈将显示在允许您设置断点的行旁边。

答案 13 :(得分:0)

通过使用 F9 来运行应用程序,断点将按预期工作。我正在使用XE4,我不知道这是否会“修复”以前版本的Delphi。

答案 14 :(得分:0)

如果项目组使用包(BPL),请确保它们都没有任何关于隐式导入单元的编译器警告。如果存在,您将只能通过CPU调试窗口逐步执行代码。

答案 15 :(得分:0)

迟到的答案,但我也偶然发现了这个问题。

如果我使用调试配置在项目管理器中激活MyPackage.bpl(粗体),然后编译它,我可以看到IDE注册了调试信息(编辑器左侧的蓝点)。

但是当我激活我的MainProject.exe(使用MyPackage.bpl的那个)时,那些蓝点将消失,表明调试信息不​​再存在。经过一番讨论后,我意识到我确实在MyPackage.bpl的Release配置上设置了依赖关系(右键单击MainProject.exe - > Dependencies),而不是在Debug配置上。

每次编译MyProject.exe时,它都会与Release配置链接,而不是调试配置!

请检查您的依赖配置!

答案 16 :(得分:0)

我在Delphi Compile(我们做MS Builds)下检查了MSBuild。这阻止了断点的运作。未选中且有效。

答案 17 :(得分:0)

我通过确保将Debug设置为Local来解决了我的问题:

enter image description here

答案 18 :(得分:0)

尽管这是一个老问题,但我可以确认,在当前版本的Delphi 10.3 Rio中,这仍然是一个问题。

上面关于行尾的答案

https://stackoverflow.com/a/53360447/6445054

为我解决了这个问题,我导入了一些非常旧的带有CR行尾的Delphi代码 在几个地方,一旦我开始在调试过程中移动代码,便彻底中断了。

现在,在里约热内卢,打开行尾的选项略有移动 (工具-选项-编辑器-源-显示换行符。)