DelphiXE中的异常位置未正确位于调试器中?

时间:2011-07-31 10:06:02

标签: delphi debugging delphi-xe

调试器找不到异常的行,无论是深入还是深入。

代码:

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)都没有定位。

这需要查看调用堆栈以回到看起来不正确的原因。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

当您使用调试DCU时,您需要使用调用堆栈来查看执行到达throw的方式。调试器无法在引发异常的时间点之前中断任何内容。

如果没有调试DCU,调试器只能在具有调试信息的一行代码中断。这必须在你的代码中的某个地方。

答案 1 :(得分:1)

根据我的经验,如果停止位置与断点不匹配,则您对源代码的可见性存在问题,即它与编译不一致。在IDE中意外打开(略有不同的)源副本也很容易 - 这似乎会混淆IDE,如果经常在该窗口中停止从另一个窗口编译。