簡體   English   中英

如何從 Delphi 模塊中的訪問沖突地址中查找代碼?

[英]How to find code from access violation address in a Delphi module?

讓我通過考慮兩個 dll 來解釋這個問題。 假設 abc.exe 正在使用 xyz.dll。 在運行 abc.exe(Delphi) 時,出現訪問沖突。

項目 abc.exe 引發異常類 EAccessViolation,並帶有消息“模塊“xyz.dll”中地址 39275E81 的訪問沖突。 寫入地址 737A24A4"。

由於某種原因,我無法調試 xyz.dll(也是 delphi)。 因此,我想使用上述消息中的地址跟蹤 xyz.dll 中的代碼部分。 我怎樣才能找到該代碼部分? 還有其他選擇嗎?

提前致謝。

有許多第三方工具可以跟蹤源代碼中的異常,或者您可以自己制作。 這個簡單的一個使用 JCL 調試過程:

procedure AnyExceptionNotify(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
   ExceptLines: TStringList;
begin
   ExceptLines := TStringList.Create;
   try
      JclLastExceptStackListToStrings(ExceptLines, False, False, True);
      ExceptLines.Insert(0, 'ProcessID: ' + IntToStr(GetCurrentProcessID));
      ExceptLines.Insert(1, 'ThreadID: ' + TThread.CurrentThread.ThreadID.ToString);
      ExceptLines.Insert(2, (ExceptObj as Exception).Message);
      ExceptLines.Insert(3, '[begin_stack_trace]');
      ExceptLines.Append('[end_stack_trace]');
      ExceptLines.SaveToFile('ExceptTrace.txt');
   finally
      ExceptLines.Free;
   end;
end;

initialization
   JclStartExceptionTracking;
   JclAddExceptNotifier(AnyExceptionNotify);

這樣,您將在代碼中注冊任何異常並將異常的調用堆棧存儲到文件中以供進一步分析。

就這樣嗎?

您可以使用兩種方式:

1 Delphi Options >Debugger Option > Embarcadero Debugge> Language Exception,取消選中“Exception types ton ignore”中的所有選項。

2使用調試器並查看所有對象,當您找到值為nil的對象時,您“找到了問題”。

請記住:訪問沖突錯誤是由訪問尚未創建的對象引起的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM