Delphi:为什么有时断点无法使用(在IDE上以绿色高亮显示的行)?

38

我偶尔会在Delphi中失去断点功能。

我以为这是Delphi 2009的问题,但现在我在Delphi XE中也遇到了同样的问题。

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

在Delphi XE中,我无法使断点出现。我已经安装了更新1和所有热修复补丁。

有人有解决方案吗?

20个回答

55

文件中不存在调试信息。

确保您正在使用调试配置。(项目管理器树,展开构建配置,确保Debug字体加粗。如果没有,则右键单击Debug并从上下文菜单中选择激活。)确保您对项目进行了构建而不仅仅是编译

如果仍然无法解决问题,请从IDE的主菜单转到项目->选项,点击Delphi编译器下的编译,并检查窗口右半部分的调试部分。确保调试信息本地符号都被选中。如果要跟踪进入VCL自己的源代码,请勾选使用调试dcus(在正常调试时会变得很麻烦,完成后您将需要关闭它并对项目进行完整的构建)。同样,您需要进行构建而不是编译。

如果所有上述方法都失败了,则有可能您在Code Editor中打开的代码单位与编译器看到的不是同一个。确保您的计算机上没有多个具有相同单元名称的文件,编译器可能会先找到它们。如果您不确定,请删除该单元名称的.dcu文件,然后构建您的项目,并查看新创建的.dcu文件是否在您期望的位置。


4
我可以补充一点,如果某些代码行永远不会被执行,它们可以被跳过。例如,如果您在从未调用的函数/过程中放置断点。另外,如果您在“非可执行”代码行上放置断点,它将被标记为此类(例如:注释掉的代码行,“begin”或“end”关键字)。 - LightBulb
我尝试了上面和下面的建议,但直到我尝试了Ken White的答案,才真正解决了问题。现在它可以工作了...谢谢Ken。 - ThN

26

我找到了更好的方法。

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

断点会神奇地重新出现,这是非常快速的方法。


10
这对我没有用。使用 RAD-XE C++ Builder。这是该软件自从 1.0 版本以来一直存在的又一个愚蠢的错误。很抱歉我多年前被绑定到 VCL 上。我花费的精力比修复 bug 还要多。当初我应该选择 Visual Studio。 - Eric
1
@user193655:是的,同意。另一个令人烦恼的问题是,我有一个未停靠的项目管理器窗口,消息窗口停靠在项目管理器旁边,每次启动RadXE时都必须不断地定位和重新连接它们。太他妈的烦人了。是的,我确实定义了自定义布局,并尝试保存了几次。你会认为Embarcadero现在应该已经修复了这样的问题。我运行的是RadXE3,从CBuilder 1.0、3.0、5.0、6.0、2010-2011等版本中,你会期望像这样的垃圾问题被解决了。 - Eric
在我的电脑上,Windows 10 和 Delphi 2007 上都可以运行。 - jcfaria
在 Delphi 7 中,命令是 Project > Clear Unit Cache。这不会删除 DCU 文件,因此结合手动从 PROJECT\objects 文件夹中删除 DCU,可以使断点再次正常工作。 - AlainD
适用于 Delphi Sydney! - djdance

15

我怀疑这种情况发生在你进行了一个发布版本的构建,并禁用了调试功能。然后你切换回调试配置并进行编译而不是构建。你无法设置断点的文件与使用禁用调试的编译产生的DCU文件对应。

只需进行构建以重新生成所有DCU文件即可使您的断点再次正常工作。


4
有时手动删除所有生成的文件(dcu、bpl、dcp等)是确保没有缺少调试信息的文件停留在某个搜索路径中的最快方法。然后进行完整的重建。这比起他方法更快速地帮助我多次快速解决了这个问题。 - Heinrich Ulbricht
我已经尝试了列表中的每个建议,但对我都没有用。RAD XE。然而,这是自从1.0版本以来就存在于他们垃圾产品中的一个漏洞。不幸的是,由于我必须维护几个大型产品来支付我的账单,我被困在VCL中。 - Eric

9
这是代码未对齐和断点标记(编辑器边栏中的蓝色/红色“药丸”)之间出现偏差的又一个原因。编辑器会识别三种不同的换行符号: CRLF(回车-换行对)、CR(回车符)和LF(换行符)。其中,默认情况下,编辑器使用CRLF。然而,编译器似乎不认为CR是一个有效的换行符,只有CRLF和LF才是有效的。因此,如果源文件中有一个或多个CR,那么“蓝色药丸”的位置就会与源码偏离。有可能你从互联网上获得的源文件包含单独的CR EOL字符,例如在MAC OS上。你可以打开编辑器中EOL的显示功能来验证您的文件中的EOL:(工具-选项-编辑器选项-源选项-显示行换行符)。
这些符号看起来很奇怪(见下面的图片),但只是C放在L上表示CRLF,C放在R上表示CR,L放在F上表示LF。
下面的图片展示了正常的EOL(CRLF)以及我在十六进制编辑器中强制使用CR only和LF only后的EOL。如上所述,正是CR only偏移了源代码的断点标记。
正常的CRLF EOL:

enter image description here

一行只有CR,另一行只有LF

enter image description here

修复
要将所有的EOL重置为CRLF,请在编辑器选项中取消勾选保留行尾

(工具-选项-编辑器选项),

进行微小的更改,以便文件被标记为已修改,关闭文件,保存更改到XYZ.pas?,然后重新打开。
现在所有的行结束符都是CRLF。重新构建项目,所有断点球将位于正确的位置。


4
多年前我在一个会议上与丹尼·索普交谈时,他把代码中的点称为“球”。“你只有拥有‘球’,才能进行调试”。他解释道,加了个眨眼表情。 - Dave Nottage

7

对于我来说,开启远程调试符号就解决了这个问题(其他方法都没用)。项目 > 选项 > 链接,然后勾选包含远程调试符号。


6

我曾经遇到与XE4相同的问题。几小时前,我发现了这篇文章。上面提供的解决方案都无法解决我的问题。而对我来说正确的解决方案 - 目前为止 - 是添加“远程调试符号”选项。奇怪的是我并没有使用远程调试。不管怎样,现在看起来可以了。


5

这是一个bug,重新启动Delphi将会解决您的问题。


刚刚在XE3上遇到了这个问题。编译时,蓝色的断点标记正常显示。但是一按F9,这些标记就消失了,应用程序初始化后断点变成了绿色。已经设置了完全调试,包括远程符号。于是我开始逐个取消勾选,手动删除所有dcu文件等内容,重新编译,再重新勾选,再编译,但都没有效果。重启IDE后问题解决了。需要注意的是,这个IDE运行在一个虚拟机中,该虚拟机已经挂起了大约2个月。突然的时间差可能是导致这个bug的原因。 - ciuly
看起来在IDE中重新加载项目(作为普通项目或作为项目组的一部分)对我也有效。 - Jeroen Wiert Pluimers

3

尝试将远程调试应用到本地计算机。

为什么要这样做:(来源)

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

当然,您必须首先将项目的“链接”选项“映射文件”配置为“详细”以生成*.rsm文件。请参阅远程调试概述以了解如何入门。


2
尽管这是一个老问题,但我可以确认在当前版本的Delphi 10.3 Rio中仍然存在这个问题。
上面关于行结束符的答案。

https://dev59.com/hW025IYBdhLWcg3w_rFA#53360447

这段话的意思是:对我解决了问题,我导入了一些非常老的 Delphi 代码,其中有几个地方有 CR 行结束符,在我开始移动代码时,调试完全崩溃了。在 Rio 版本中,打开行结束符选项的位置已经稍微改变了(工具-选项-编辑器-源-显示行结束符)。

2

断点无法正常工作的另一个原因可能是(通常在 Delphi5 中测试):
单元中过多的过程。
解决方法是将过程移动到另一个单元中。


那个问题已经在一段时间之前被修复了。 - Johan

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