2011-06-20 5 views

答えて

1

JclHookExceptユニットのJclAddExceptNotifierをご覧ください。

+0

ありがとうございました。私もgoogledこれhttp://andremussche.blogspot.com/2007/09/adv-debugging-hook-all-exceptions.html –

+0

@Melaum:おそらく非常に興味深いですが、残念ながら私はドイツ語を話しません。 (それがドイツ語でないなら、それが何であれ、私はそれも話さない) –

+1

それはドイツ語ではなく、オランダ語です。 – jpfollenius

10

これはJCLベースではありませんが、完全なオープンソースであり、Delphi 5からXEまで動作します。

このlogging mechanismは、例外を傍受することができます。

実際には、デルファイ6以来、あなたはどの例外が発生したときlauchedすることがRtlUnwindProcでグローバルな手順を定義することができますが:

{$ifdef DELPHI5OROLDER} 
procedure RtlUnwind; external kernel32 name 'RtlUnwind'; 
{$else} 
var 
    oldUnWindProc: pointer; 
{$endif} 

procedure SynRtlUnwind(TargetFrame, TargetIp: pointer; 
    ExceptionRecord: PExceptionRecord; ReturnValue: Pointer); stdcall; 
asm 
    pushad 
    cmp byte ptr SynLogExceptionEnabled,0 
    jz @oldproc 
    mov eax,TargetFrame 
    mov edx,ExceptionRecord 
    call LogExcept 
@oldproc: 
    popad 
    pop ebp // hidden push ebp at asm level 
{$ifdef DELPHI5OROLDER} 
    jmp RtlUnwind 
{$else} 
    jmp oldUnWindProc 
{$endif} 
end; 


oldUnWindProc := RTLUnwindProc; 
RTLUnwindProc := @SynRtlUnwind; 

このコードは、次の機能を起動します:

type 
    PExceptionRecord = ^TExceptionRecord; 
    TExceptionRecord = record 
    ExceptionCode: DWord; 
    ExceptionFlags: DWord; 
    OuterException: PExceptionRecord; 
    ExceptionAddress: PtrUInt; 
    NumberParameters: Longint; 
    case {IsOsException:} Boolean of 
    True: (ExceptionInformation : array [0..14] of PtrUInt); 
    False: (ExceptAddr: PtrUInt; ExceptObject: Exception); 
    end; 
    GetExceptionClass = function(const P: TExceptionRecord): ExceptClass; 

const 
    cDelphiExcept = $0EEDFAE0; 
    cDelphiException = $0EEDFADE; 

procedure LogExcept(stack: PPtrUInt; const Exc: TExceptionRecord); 
begin 
    LastError := GetLastError; 
    (...) intercept the exception 
    SetLastError(LastError); // code above could have changed this 
end; 

Delphi 5の場合、I had to patch the VCL in-processは、グローバル例外インターセプタがないためです。

+2

+1、興味深い –

+0

非常に興味深い、あなたの答えのおかげで! –

+0

最新バージョンは、XE4/XE5、Win32/Win64プラットフォームをサポートしています。 –

関連する問題