断点命中时,单元源代码与代码执行路径不匹配

时间:2011-10-28 18:58:09

标签: delphi debugging breakpoints

我正在调试使用Delphi 6 Pro使用DSPACK代码库创建的DirectShow过滤器。当我设置的断点在一个名为BaseClass.pas的特定单元中被命中,并且我开始跟踪时,执行点跳转到源代码中的奇怪位置。这通常表示被跟踪的源代码与编译到Delphi应用程序使用的其中一个软件包中的源代码不匹配。奇怪的是,它只是BaseClass单元,因为我已经跟踪了属于DSPACK代码库的其他单元,并且它们没有出现这个问题。我没有使用运行时包。

我扫描了我的磁盘,发现只有一个BaseClass.dcu副本,其修改日期等于我上次构建程序的时间。我没有修改该单元的源或属于DSPACK的任何其他源。由于我的Filter是主应用程序的一部分,这表明BaseClass.pas会受到双重用途的影响,因为它用于构建DSPACK组件包(dpk),并且我的主应用程序也直接通过TBCSource对象引用它我的过滤器来自。请注意,我确实尝试将单位PAS文件直接添加到我的项目中,但没有修复任何内容。

我还回过头来重新打开每个DSPACK包文件并进行了全面的重新构建。这些都没有帮助。还有什么我可以尝试让源与BaseClass单元的编译图像同步吗?或者完全是一个不同的问题,如果是这样,它是什么以及如何解决它?

4 个答案:

答案 0 :(得分:4)

有时会在从网页或其他来源复制/粘贴代码时发生这种情况,并且这些行不会以CR/LF对(#13#100x0D0A结束,Windows标准)但仅以LF(#100x0A结尾,通常是以* nix系统结尾的行)或CR(#130x0D,典型的Mac OSX / iOS)。错误的行终止符会混淆调试器 - 这对于过去的几个Delphi版本来说都是一个问题。

您有时可以通过使用文本编辑器(如记事本)打开源文件来修复此问题,进行小的无意义更改(例如,插入然后删除空白行),然后保存文件。

答案 1 :(得分:4)

我有同样的问题并且做了类似的实用程序。固定它。 基本上就是这样:

procedure adjustCRLF(filename : String);  
var  
    strList : TStringList;  
begin  
    strList := TStringList.Create;  
try  
    strList.LoadFromFile(filename);  
    strList.Text := AdjustLineBreaks(strList.Text);  
    strList.SaveToFile(filename);  
finally  
    strList.Free;  
end;  
end;

答案 2 :(得分:1)

确保在重建时,在项目的编译器选项中打开了“调试信息”。实际上,调试中的大多数选项都应该在项目的编译器选项中设置。

另外,如果还没有,请重新启动Delphi。

答案 3 :(得分:1)

还有另一种方法可能发生:如果IDE错误地打开另一个具有相同名称的源文件(但不同,例如早期版本),则所有调试点都将不正确,调试器甚至会允许您单步执行不正确的文件。 我曾经看过Delphi 7这样做过一次。