调试器找不到异常的行,无论是深入还是深入。
代码:
procedure LoadLogo;
const
RES_APP_LOGO = 'AppAboutLogo';
var
resourceStream : TResourceStream;
begin
try
resourceStream := TResourceStream.Create( HInstance, RES_APP_LOGO, RES_TYPE_FXRESOURCES );
resourceStream.Position := 0;
ImageLogo.Picture.Bitmap.LoadFromStream(resourceStream); //---> causes exception (A)
Refresh();
finally
FreeAndNil(resourceStream);
end;
end;
procedure TForm.Initialize;
begin
//do something....
LoadLogo(); //(C)
AnotherFunction(); //<----- debugger points here (B)
end;
procedure TForm.CreateCreate(Sender : TObject);
begin
Initialize();
end;
在位置(A)的异常中,使用“Use Debug DCUs”= false,调试器指向(B),异常发生后调用的函数外部的行。使用“Use Debug DCUs = true”,它会破坏Graphics.pas中的通用Exception thrower。异常类很好,从调试角度来看,位置不正确或有用 - 调用位置(C)和真实原因点(A)都没有定位。
这需要查看调用堆栈以回到看起来不正确的原因。
有什么想法吗?
答案 0 :(得分:2)
当您使用调试DCU时,您需要使用调用堆栈来查看执行到达throw的方式。调试器无法在引发异常的时间点之前中断任何内容。
如果没有调试DCU,调试器只能在具有调试信息的一行代码中断。这必须在你的代码中的某个地方。
答案 1 :(得分:1)
根据我的经验,如果停止位置与断点不匹配,则您对源代码的可见性存在问题,即它与编译不一致。在IDE中意外打开(略有不同的)源副本也很容易 - 这似乎会混淆IDE,如果经常在该窗口中停止从另一个窗口编译。