dll (COM 개체 포함)에 문제가 있습니다. dll이 언로드되면 일부 종료 섹션이 실행되고 일부는 실행되지 않습니다.delphi dll-finalization : 디버그 방법
디버거에서 시스템 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 블록 (또는 그 뒤에 나오는 행)을 호출해야한다고 생각했습니다.
노트 : 나는 수동으로이 특별한 전화를 피할 때
- , 다른 모든 기능은 정상적으로 실행됩니다.
- 은 내가
TCriticalSection.Enter
에 결국 문제가TProc
에 단계 때 (다음Acquire
-FSection.Enter
-EnterCriticalSection
-WSACleanup
)
WSACleanup
호출에 좀 더 많은 정보는 : 나는 TCP를 열어 제 3 자 라이브러리 UniDAC를 사용/IP 연결을 데이터베이스에 - 나는이 라이브러리를 finalization 섹션 중 하나에서 WSACleanup
이라고 부른다 (나는이 소스 코드를 가지고 있지 않다). 이상한 것은 디버거가 WSACleanup
줄에 때입니다 (응용 프로그램이 정상적으로 종료 것처럼)
function WSACleanup; external winsocket name 'WSACleanup';
과 내가 (예 : F8)를 통해 단계하려면, 디버거 그냥 중지 -하지만 FinalizeUnits
에 루프를 계속 진행해야합니다. 어떻게 가능합니까? 즉, 교착 상태라면 멈추지 않고 영원히 걸릴 것입니다. 맞습니까?
질문 : 어떻게이 문제를 디버깅 할 수 있습니까? 교착 상태로 인해이 문제가 발생할 수 있습니까 (즉, 디버거가 중지됨)?
"TCriticalSection.Enter에서 끝납니다."- 거기에서 아무데도 가지 않습니까? –
"나는 예외 블록을 생각했다"당신은 아마 finally 블록을 생각하고있다. 나는 당신이 좋은 제안에 대한 답을 얻었고, FinalizeUnits로 디버깅하려고하는 것이 얼마나 고통 스러웠는지 알고 있습니다, 나는 당신이 당신이 마우스 오른쪽 버튼으로 브레이크 포인트에 "통과 횟수"를 설정할 수 있다는 것을 알고 싶었는지 확인하고 싶었습니다. gutter에서 빨간색 점을 클릭하고 "Breakpoint properties ..."로 이동하십시오. – MartynA
디버그 dcus를 활성화하고 문제가있는 단위를 찾으십시오. 그런 다음 교착 상태가 발생한 이유를 알아보십시오. –