2011-07-31 40 views
3

調試器沒有找到異常的行,無論是深入還是晚。DelphiXE中的異常位置未正確位於調試器中?

代碼:

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)中,用「使用調試的DCU」 =假,則調試器點(B),該函數外的線的異常後稱爲發生。使用「Use Debug DCUs = true」時,它會在Graphics.pas中的通用異常thrower中斷。異常類很好,從調試的角度來看,該位置是不正確的或有用的 - 既不是調用位置(C)也不是實際原因點(A)。

這需要查看調用堆棧以回到看起來不正確的原因。

任何想法?

回答

2

當您使用調試DCU時,您需要使用調用堆棧來查看執行到達拋出的方式。調試器無法在引發異常的時間點之前中斷任何操作。

如果沒有調試DCU,調試器只能在具有調試信息的代碼行處中斷。這必須在你的代碼中。

1

根據我的經驗,如果停止位置與斷點看起來不匹配,那麼源代碼的可見性有問題,即與編譯不一致。在IDE中意外地打開一個(slighlty不同的)源代碼副本也很容易 - 這似乎混淆了IDE,並且經常停在那個從另一個窗口編譯的窗口中。

+0

你所描述的確發生了,但這不是OP描述的內容 –