簡體   English   中英

delphi dll最終化:如何調試

[英]delphi dll-finalization: how to debug

我在dll(包括COM對象)中遇到問題:卸載dll時,會執行某些完成部分,而某些則不會。

在調試器中,我可以設法在System FinalizeUnits()中定位問題。 此函數的偽代碼-為了您的方便:

procedure FinalizeUnits;
var
  Count: Integer;
  Table: PUnitEntryTable;
  P: Pointer;
begin
  if InitContext.InitTable = nil then
    exit;
  Count := InitContext.InitCount;
  Table := InitContext.InitTable^.UnitInfo;
  try
    while Count > 0 do
    begin
      Dec(Count);
      InitContext.InitCount := Count;
      P := Table^[Count].FInit;
      if Assigned(P) and Assigned(Pointer(P^)) then
      begin
        // ISSUE: when this is called for item x the debugging just stops
        // breakpoints in the except block or at the end of the function are not reached!
        TProc(P)(); 
      end;
    end;
  except
    FinalizeUnits;  { try to finalize the others }
    raise;
  end;
end;

有一個特定的完成調用會導致此問題:
也就是說, InitContext.InitCount大約為400,並且在執行項x(例如363)時,調試器只是停止:它不會繼續執行except塊,也不會繼續執行FinalizeUnits()函數的末尾(在該處我已設置斷點) )。
順便說一句:那怎么可能? 我認為在任何情況下都必須調用except塊(或其后的行)。

筆記:

  • 當我手動避免此特殊調用時,所有其他功能均正常執行。
  • 當我進入有問題的TProc我最終進入TCriticalSection.Enter (然后, Acquire FSection.Enter - EnterCriticalSection - WSACleanup

有關WSACleanup調用的更多信息:我使用第三方庫UniDAC,該庫打開了與數據庫的TCP / IP連接-我認為該庫在其完成部分之一中調用WSACleanup (但我沒有此源代碼)。 奇怪的是,當調試器位於WSACleanup行上時:

function WSACleanup;        external     winsocket name 'WSACleanup';

並且我想跨過它(即F8),調試器就停止了(就像應用程序正常退出一樣)-但是它應該在FinalizeUnits繼續循環:這怎么可能? 即,如果這是一個僵局,它不會停止,而是永遠掛下來,對嗎?

問題是:如何調試此問題? 死鎖是否可能導致此問題(即調試器剛剛停止)?

在使用F7進入有問題的TProc之前,請嘗試切換到CPU視圖。 有時這可以給您一個很好的提示。

您也可以嘗試在地圖文件中查找“ P”的地址。

暫無
暫無

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

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