在 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 是罪魁祸首,并且未能在正确的位置设置断点。如果它只是改变一些文本,也许这永远不会引起你的注意。拆分单位对我有帮助,也许对你也有帮助。