У меня проблема в 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), отладчик просто останавливается: он не переходит к блоку исключений, а также не доходит до конца функции FinalizeUnits()
(где я установил точки останова).
Кстати, как это возможно? Я думал, что блок exclude (или строка после него) должен вызываться в любом случае.
Примечания:
- когда я вручную избегаю этого специального вызова, все остальные функции выполняются нормально.
- когда я вступаю в проблемную
TProc
, я попадаю вTCriticalSection.Enter
(затемAcquire
-FSection.Enter
-EnterCriticalSection
-WSACleanup
)
еще немного информации о вызове WSACleanup
: я использую стороннюю библиотеку UniDAC, которая открывает соединение TCP/IP с базой данных - я думаю, что эта библиотека вызывает WSACleanup
в одном из разделов завершения (но у меня нет этого исходного кода). Странно то, что когда отладчик стоит на строке WSACleanup
:
function WSACleanup; external winsocket name 'WSACleanup';
и я хочу перешагнуть его (т.е. F8), отладчик просто останавливается (как будто приложение завершилось нормально) - но он должен продолжить цикл в FinalizeUnits
: как это возможно? т.е. если бы это был тупик, то он бы не остановился, а завис навечно, верно?
Вопрос: как я могу отладить эту проблему? возможно ли, что эта проблема вызвана взаимоблокировкой (т.е. что отладчик просто останавливается)?
InitContext.InitTable.TypeInfo.UnitNames
выглядит многообещающе — но как его использовать? - person TmTron   schedule 03.12.2014