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

38

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

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

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

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

有人有解决方案吗?

20个回答

2
我曾经遇到过类似的问题:我在某个文件中失去了断点,但其他文件都没问题。后来我发现,原来是因为我重命名了那个文件,但不知道的是,旧文件的DCU仍在被使用,因为它还在某个"uses"子句中被引用。
解决方法是手动删除所有的DCU(只进行"clean"操作是不够的,因为旧文件所代表的DCU已经不在项目中了),然后重新编译。你会得到一个编译错误,显示出有问题的"uses"子句。

1

我通过确保调试设置为本地解决了我的问题:

enter image description here


1
在Delphi 7中,设置断点存在真正的bug。我有一个单元,其中许多文本在接口部分定义为“const constname : array[0..x] of record-type = (...);”,其中record-type具有一些AnsiString项。在实现部分有一些过程。在某些特定情况下,当我在过程内任何位置设置断点时,Delphi不会停止在它上面!所有调试选项都已正确设置(例如F7会导致Delphi在程序“begin”处停止,整个单元中的蓝点可见,执行应用程序时该行保持红色),所有具有相应PAS文件的DCU都已从我的所有磁盘和所有文件夹中删除,在对整个项目进行完整构建之前。因此,不应该在任何地方挂起wold文件。为了测试,我将PAS重命名为另一个以前从未使用过的名称,并适应了所有源代码并重新编译,只是为了确保Delphi和我正在查看相同的PAS文件-但断点也无法正常工作。
但是还有一件非常奇怪的事情发生了:文本常量(!)在我的可执行文件中发生了变化(不是在exe文件中,而是显然在内存中)!在程序启动时检查这些文本是否正确,有时会出现错误!在消息框中显示这些文本,发现其中一个定义为const的文本中有一个字符被改变了。为了测试,我尝试在代码中将一些内容分配给这些常量,但是编译器像预期的那样抱怨了,因此它不能是普通赋值导致文本发生变化的原因,必须是一个错误的指针。很奇怪。

于是,我花了几个小时进行测试,寻找可能设置错误指针的源代码,后来可能导致文本常量发生变化。我将消息框放置在第一个单元的初始化部分中,该单元是我能够编辑的单元初始化链中的第一个,但已经更改了字符!必须在启动应用程序时非常早地进行更改!

最后,我弄清楚了,出现在我的文本中的字符总是$CC-这正是INT 3的汇编代码,也就是Delphi用于设置断点的代码。当在该单元中向上或向下移动断点时,改变的字符的位置也会向左或向右移动一些字符!而且错误字符移动的数量恰好与所涉及的行需要的估计汇编代码字节数相对应。在接近彼此的行中设置两个断点,突然间有两个字符改变了!当从该单元中删除所有断点时,文本保持不变!所以只有一个结论:当尝试设置断点失败时,Delphi本身会更改这些文本。我无法摆脱这个bug。所有关于重新同步Delphi源代码和目标代码文件的内部簿记的提示都没有帮助我解决问题!由于相关单元主要由多个{$IFDEF}之间的{$I}行组成,包括一些不同但较长的Pascal文本,因此我认为Delphi在处理太长的包含或条件编译器指令时存在问题。所以我删掉了包含文件并将源代码文本直接放入单元中,并删除了{$IFDEF},这编译没有错误,但是设置断点也会更改我的文本常量,而不是停止执行。完全相同!
我现在通过将单元分成两个单元来解决了这个问题,一个单元只包含其接口部分中的文本常量,另一个单元用于保存过程。现在,在不更改任何编译器或链接器设置的情况下,所有断点都按预期工作,不再更改任何文本!
因此,如果您确定应该起作用但断点不起作用,可能是Delphi的问题,并且无法在正确的位置设置断点。如果只是更改一些文本,则可能永远不会引起您的注意。将单元拆分为两个有助于解决我的问题,也许可以帮助您解决问题。

1
如果您尝试在DLL文件中设置断点,则需要通过在项目管理器中双击该DLL文件使其变为粗体并构建它,以使该DLL文件处于活动状态。然后蓝色圆圈将显示在允许设置断点的行旁边。

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

0
在我的情况下,我正在一个单元中设置断点,虽然该单元在IDE中打开,但并不是当前活动项目的一部分。这样的断点也显示为绿色。换句话说,我完全没有找对页面。
(在尝试了上述所有方法后,我才发现了这一点。)

0

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


0

回答有点晚,但我也遇到了这个问题。

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

但是当我激活了使用 MyPackage.bpl 的 MainProject.exe 时,那些蓝色点会消失,表示调试信息不再存在。经过一番思考,我意识到我没有在 Debug 配置上设置依赖项(右键单击 MainProject.exe -> Dependencies),而是在 Release 配置上设置了依赖项。

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

因此,请检查您的依赖项配置!


0

我在 Delphi 编译中勾选了 MSBuild(我们使用 MS Builds)。这会导致断点无法正常工作。取消勾选后问题得到解决。


0

由于在新笔记本电脑上安装 Delphi XE 时遇到此问题时,这是我找到的最佳资源,因此我将为 Delphi XE 添加一个可能的答案。

如果您使用的是双显示器设置,并且代码编辑器窗口位于第二个显示器上,则工具提示将不会显示。如果编辑器窗口位于主显示器上,则可以正常工作。非常令人沮丧。可能是驱动程序问题。


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