2014-02-14 3 views
0

COM 기술을 기반으로 한 프로젝트. 델파이 XE4 64 비트에 JCL에 의한 오류를 기록했다 (SKGeneral64은 COM DLL이 있습니다) :델파이 XE4 64 비트 _TExitDllException

ERR (ThreadID=14C8 14.02.2014 16:43:14:274) - Exception class: _TExitDllException 
Exception address: 000000000536DBAE 
Stack list, generated 14.02.2014 16:43:14 
[000000000536DBAE] System.ExitDll + $3E 
[000000000536DCF4] [email protected] + $54 
[000000000536D5E3] [email protected] + $123 
[0000000005375FA2] [email protected] + $92 
[00000000056D7938] SKGeneral64.SKGeneral64 + $38 
[000000007777C76C] Unknown function at RtlUserThreadStart + $26C 
[000000007777C42F] Unknown function at LdrInitializeThunk + $10F 
[000000007777C32E] LdrInitializeThunk + $E 
---------------------------------------------------------------------------------------------------- 
System : Windows 7 Professional, Version: 6.1, Build: 1DB1, "Service Pack 1" 
Processor: Intel, Intel(R) Xeon(R) CPU   X5670 @ 2.93GHz, 2960 MHz MMX 
---------------------------------------------------------------------------------------------------- 
Module: C:\PROGRA~2\SKBKON~1\Active\Bin\SKGENE~2.DLL Modified: 14.02.2014 16:42:37 
Version: 1.0.0.0 Description: 

무엇의 이유? 메모리 누수와 메모리 단편화의 원인이 될 수 있습니까?

+0

코드를 보지 않고 말하기 어렵습니까? – whosrdaddy

+0

@whosrdaddy 나중에 예를 들어 코멘트에 당신을 쓸 것입니다. – Sibay

답변

2

약간의 파고가 있었지만이 예외가 예상되며 스레드가 종료 될 때 스레드가 종료 코드를 반환하는 방식입니다.

다음은 어떻게 진행 되나요? 호출은이 작업을 수행 System.ExitDll로 구성되어 있습니다

예외를 제기 무엇
procedure ExitDll(Context: PInitContext); 
var 
    ResultExitCode: Integer; 
begin 
    Context^ := Context.OuterContext^; 
    ResultExitCode := ExitCode; 
    ExitCode := 0; 
    //raise _TExitDllException.Create(ResultExitCode); 
    _RaiseExcept(_TExitDllException.Create(ResultExitCode)); 
end; 

. 예외는 _HandleExitDllException에서 처리됩니다

function _HandleExitDllException: Integer; 
var 
    ExceptionObject: TObject; 
begin 
    Result := -1; 
    ExceptionObject := ExceptObject; 
    if ExceptionObject is _TExitDllException then 
    Result := _TExitDllException(ExceptionObject).ExitCode 
    else 
    _UnhandledException; 
    _DoneExcept; 
end; 

이 코드는 예외에서 종료 코드를 읽고 호출자에게 그 값을 반환합니다. 아마도 _HandleExitDllException을 호출하는 RTL 코드는 컴파일러/링커가 마술처럼 링크되어 있기 때문에 볼 수 없습니다.

본질적으로 이는 오류보고 소프트웨어에서 오 탐지됩니다. 이 예외는 일반적인 프로그램 실행의 일부입니다. 걱정할 것이 없습니다. 결함이있는 것으로 보이는 오류보고 코드 외에도.

+0

이렇게 메모리 누출이 될 수 있습니까? [링크] (http://stackoverflow.com/questions/10548888/memory-leak-in-the-win64-delphi-rtl-during-thread-shutdown) – Sibay

+0

누수라고 생각하는 이유는 무엇입니까? 제 생각에 당신의 버그보고 소프트웨어는 결함이 있습니다. 나는 madexcept의 팬이다. –

+0

질문 사항 : * 메모리 누수와 메모리 단편화의 원인 일 수 있습니까? * 메모리 누수는 무엇입니까? 어떤 분열? –