我正在调试使用Delphi 6 Pro使用DSPACK代码库创建的DirectShow过滤器。当我设置的断点在一个名为BaseClass.pas的特定单元中被命中,并且我开始跟踪时,执行点跳转到源代码中的奇怪位置。这通常表示被跟踪的源代码与编译到Delphi应用程序使用的其中一个软件包中的源代码不匹配。奇怪的是,它只是BaseClass单元,因为我已经跟踪了属于DSPACK代码库的其他单元,并且它们没有出现这个问题。我没有使用运行时包。
我扫描了我的磁盘,发现只有一个BaseClass.dcu副本,其修改日期等于我上次构建程序的时间。我没有修改该单元的源或属于DSPACK的任何其他源。由于我的Filter是主应用程序的一部分,这表明BaseClass.pas会受到双重用途的影响,因为它用于构建DSPACK组件包(dpk),并且我的主应用程序也直接通过TBCSource对象引用它我的过滤器来自。请注意,我确实尝试将单位PAS文件直接添加到我的项目中,但没有修复任何内容。
我还回过头来重新打开每个DSPACK包文件并进行了全面的重新构建。这些都没有帮助。还有什么我可以尝试让源与BaseClass单元的编译图像同步吗?或者完全是一个不同的问题,如果是这样,它是什么以及如何解决它?
答案 0 :(得分:4)
有时会在从网页或其他来源复制/粘贴代码时发生这种情况,并且这些行不会以CR/LF
对(#13#10
或0x0D0A
结束,Windows标准)但仅以LF(#10
或0x0A
结尾,通常是以* nix系统结尾的行)或CR(#13
或0x0D
,典型的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这样做过一次。