2014-12-02 3 views
0

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에 루프를 계속 진행해야합니다. 어떻게 가능합니까? 즉, 교착 상태라면 멈추지 않고 영원히 걸릴 것입니다. 맞습니까?

질문 : 어떻게이 문제를 디버깅 할 수 있습니까? 교착 상태로 인해이 문제가 발생할 수 있습니까 (즉, 디버거가 중지됨)?

+0

"TCriticalSection.Enter에서 끝납니다."- 거기에서 아무데도 가지 않습니까? –

+0

"나는 예외 블록을 생각했다"당신은 아마 finally 블록을 생각하고있다. 나는 당신이 좋은 제안에 대한 답을 얻었고, FinalizeUnits로 디버깅하려고하는 것이 얼마나 고통 스러웠는지 알고 있습니다, 나는 당신이 당신이 마우스 오른쪽 버튼으로 브레이크 포인트에 "통과 횟수"를 설정할 수 있다는 것을 알고 싶었는지 확인하고 싶었습니다. gutter에서 빨간색 점을 클릭하고 "Breakpoint properties ..."로 이동하십시오. – MartynA

+0

디버그 dcus를 활성화하고 문제가있는 단위를 찾으십시오. 그런 다음 교착 상태가 발생한 이유를 알아보십시오. –

답변

1

F7을 사용하여 문제가되는 TProc에 들어가기 전에 CPU보기로 전환 해보십시오. 때때로 이것은 당신에게 좋은 힌트를 줄 수 있습니다.

지도 파일에서 "P"의 주소를 검색해 볼 수도 있습니다.

관련 문제