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

Rob*_*ler 4 delphi debugging breakpoints

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

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

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

Ken*_*ite 5

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

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


小智 5

我遇到了同样的问题并制作了类似的实用程序。修复。基本上,只是这样:

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;
Run Code Online (Sandbox Code Playgroud)