[英]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.