【问题标题】:Delphi: why breakpoints from time to time are not usable (green highlighted line on IDE)?Delphi:为什么有时断点不可用(IDE上的绿色突出显示线)?
【发布时间】:2011-08-06 12:05:52
【问题描述】:

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

我认为这是 Delphi 2009 的问题,但现在我在 Delphi XE 中也有。

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

在 Delphi XE 中,我无法显示断点。我已经应用了所有修补程序的更新 1。

有人有解决办法吗?

【问题讨论】:

  • 在底部查看我接受的答案!

标签: delphi ide breakpoints delphi-xe


【解决方案1】:

文件中不存在调试信息。

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

如果这仍然不起作用,请从 IDE 的主菜单转到 Project->Options,单击 Delphi Compiler 下的 Compiling,然后检查窗口右半部分的 Debugging 部分。确保Debug InformationLocal Symbols 都被选中。如果您试图追踪 VCL 自己的源代码,请检查 Use debug .dcus(您需要关闭它并在完成后立即对您的项目进行完整构建,因为这样做会很烦人)重新调试正常)。同样,您需要构建而不是编译。

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

【讨论】:

  • 我还可以补充一点,如果代码行永远不会被执行,可以跳过它们。例如,如果您在从未调用过的函数/过程中放置​​断点。此外,如果您在“不可执行”代码行上放置断点,它将被标记为(例如:注释代码行、“开始”或“结束”关键字)。
  • 我尝试了上面和下面的建议,但在我尝试了 Ken White 的回答之前,没有任何效果。它现在可以工作了......谢谢肯。
【解决方案2】:

我找到了更好的方法。

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

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

【讨论】:

  • 这对我不起作用。使用 RAD-XE C++ 生成器。然而,这是自 1.0 以来一直存在的这个蹩脚软件中的另一个愚蠢错误。很抱歉我几年前就被 VCL 束缚了。我对抗这个工具比对抗错误更多。我应该使用 Visual Studio。
  • @user193655:是的,同意。另一个烦人的事情是,我有一个未停靠的项目管理器窗口,其中消息窗口停靠在项目管理器上,每次我启动 RadXE 时,我都必须不断地定位和重新连接它们。好烦啊。而且,是的,我确实定义了一个自定义布局并尝试多次保存它。你会认为 Embarcadero 现在已经修复了这样的东西。我运行 RadXE3,它来自 CBuilder 1.0、3.0、5.0、6.0、2010-2011 等......你会期望像这样的垃圾垃圾得到修复。
  • 在 Windows 10 和 Delphi 2007 下为我工作。
  • 在 Delphi 7 中,命令是Project > Clear Unit Cache。这不会删除 DCU 文件,因此结合从 PROJECT\objects 文件夹中手动删除 DCU 会再次启动断点。
  • 在悉尼德尔福工作!
【解决方案3】:

我怀疑这发生在您完成发布构建并禁用调试时。然后切换回调试配置并进行编译而不是构建。无法设置断点的文件对应于那些带有由禁用调试的编译生成的 DCU 的文件。

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

【讨论】:

  • 有时手动删除所有生成的文件(dcu、bpl、dcp、...)是确保没有调试信息的文件不会在某些搜索路径中徘徊的最快方法。然后完全重建。这不止一次帮助我快速解决了这个问题。
  • 我已经尝试了这个列表中的每一个建议,但没有什么对我有用。拉德 XE。然而,自 1.0 以来,这一直是他们的垃圾产品中的一个错误。不幸的是,我不得不使用 VCL,因为我必须维护几个大型产品来支付我的账单。
【解决方案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).

这些符号看起来很奇怪(见下图),但只是 C 在 L 上表示 CRLF,C 在 R 上表示 CR,L 在 F 上表示 LF。

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

普通CRLF EOL:

一行CR only,一行LF only

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

( Tools - Options - Editor options),

做一个小改动,让文件被标记为已修改,关闭文件,将改动保存到 XYZ.pas? YES,然后重新打开。
现在所有的行尾都是 CRLF。重建项目,所有断点球都将位于正确的位置。

【讨论】:

  • 几年前,我在一次会议上与 Danny Thorpe 交谈,他将这些点称为“球”。他解释说“只有你有能力才能调试”;-)
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    打开远程调试符号对我有用(没有其他工作)。项目 > 选项 > 链接并选中包含远程调试符号。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • XE3 刚刚发生在我身上。建筑,显示蓝点就好了。我一按 F9,点就消失了,当应用程序初始化断点时,断点变成绿色。设置了绝对完整的调试,包括远程符号。所以我开始取消选中这些,手动删除所有 dcus 和东西,构建,再次检查它们,构建,但无济于事。重新启动 IDE 工作。不过需要注意的是,这个 IDE 是在一个暂停了大约 2 个月的虚拟机中运行的。突然的时差可能是导致该错误的原因。
      • 看起来在 IDE 中重新加载项目(作为普通项目或作为项目组的一部分)也适用于我。
      【解决方案8】:

      我遇到了一个相关的问题:我丢失了特定文件中的断点,但其他文件都很好。发生的事情是我重命名了该文件,但我不知道旧文件的 DCU 仍在使用,因为它在某处的“uses”子句中被引用。

      解决方法是手动删除所有 DCU(做一个“清理”是不够的,因为 DCU 代表的旧文件不再在项目中)并重建。您将收到一个显示错误“uses”子句的编译错误。

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 这个问题已经修复了。
        【解决方案10】:

        尝试远程调试到本地 PC。

        为什么有效:(source)

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

        当然,你必须先将你项目的“Linking”选项“Map file”配置为“Detailed”,才能生成*.rsm文件。请参阅 Overview of Remote Debugging 了解如何开始。

        【讨论】:

          【解决方案11】:

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

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

          中定义

          const constname : array[0..x] of record-type = (...);

          在接口部分,其中记录类型有一些 AnsiString 项。 在实现部分有一些程序。

          在某些特定情况下,当我在过程中的任何位置设置断点时,delphi 不会停止!

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

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

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

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

          所以只有一个结论:delphi 本身在尝试设置断点时会更改文本,但没有这样做。我无法摆脱这个错误。关于重新同步 delphi 的源代码和目标代码文件的内部簿记的技巧都没有帮助我!

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

          我现在通过将单元分成两个单元来解决这个问题,一个仅在其界面部分保存文本常量,第二个用于保存过程。现在,无需更改任何编译器或链接器设置,所有断点都按预期工作,不再更改文本!

          因此,如果断点对您不起作用,而您确信它们应该起作用,则可能是 delphi 是罪魁祸首,并且未能在正确的位置设置断点。如果它只是改变一些文本,也许这永远不会引起你的注意。拆分单位对我有帮助,也许对你也有帮助。

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

              上面关于行尾的答案

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

              为我解决了这个问题,我导入了一些非常旧的 Delphi 代码,这些代码有 CR 行结尾 在几个地方,当我开始移动代码时,调试就完全崩溃了。

              开启换行符的选项在里约略有变化,现在是 (工具 - 选项 - 编辑器 - 源代码 - 显示换行符)。

              【讨论】:

                【解决方案14】:

                在我的例子中,我在一个单元中设置断点,虽然在 IDE 中打开,但它并不属于当前活动项目的一部分。此类断点也显示为绿色。 IOW 我根本不在正确的页面上。

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

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    【解决方案16】:

                    答案有点晚,但我也偶然发现了这个问题。

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

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

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

                    所以检查你的依赖配置!

                    【讨论】:

                      【解决方案17】:

                      我在 Delphi Compile 下检查了 MSBuild(我们进行 MS Builds)。那是阻止断点工作。未选中,它可以工作。

                      【讨论】:

                        【解决方案18】:

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

                        【讨论】:

                          【解决方案19】:

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

                          【讨论】:

                            【解决方案20】:

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

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

                            【讨论】:

                              猜你喜欢
                              • 2017-07-30
                              • 2014-08-05
                              • 2016-01-11
                              • 2023-03-11
                              • 2020-11-19
                              • 1970-01-01
                              • 2021-06-09
                              • 1970-01-01
                              相关资源
                              最近更新 更多