2011-10-28 53 views
2

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

我扫描了我的磁盘,发现只有一个修改日期等于上次构建程序的BaseClass.dcu副本。我没有修改该单元或任何其他属于DSPACK的源代码。由于我的过滤器是主应用程序的一部分,因此它指示BaseClass.pas将受制于双重使用情况,因为它用于构建DSPACK组件包(dpk),并且也由我的主应用程序直接通过TBCSource对象引用我的过滤器从下降。请注意,我尝试将单位PAS文件直接添加到我的项目中,但这并没有解决任何问题。

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

回答

3

有时出现这种情况时,代码复制/从网页或其他来源粘贴,并线不CR/LF对(#13#100x0D0A,标准适用于Windows)结束,但仅在LF(#100x0A结束,通常以* nix系统结尾的行)或CR(#130x0D,通常用于Mac OSX/iOS)。不正确的行结束符混淆了调试器 - 这是过去几个Delphi版本的问题。

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

+1

谢谢你提醒我。我只是尝试了你的建议,不幸的是没有改变。 –

+0

我记得很久以前我写了一个实用工具,专门用来清理任何*垃圾字符的Delphi文件,并确保所有行尾字符都是真正的CRLF对。我找到它并在BaseClass.pas上运行,错误消失。所以记事本保存/重新加载在某些情况下显然是不够的,但它是一个垃圾邮件字符问题。不幸的是,这让我们失去了几个小时,但很高兴它已经修复了。 –

+1

:)这就是为什么我说“有时”,而不是“你可以修复”。很高兴我可以帮忙,即使它有点儿。 –

1

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

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

+0

好主意,但我再次检查,调试信息确实是。 –

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; 
+0

保存文件时,编辑器应该自动清理行尾! – Shannon

1

还有另一种方式会发生这种情况:如果IDE错误地打开与另一个同名的源文件(但不同的,如早期版本),那么所有的调试点会不正确,并且调试器甚至会允许您逐句通过不正确的文件。 我见过Delphi 7做过一次。