gpt4 book ai didi

delphi - 有没有办法用 JCLDebug 捕获所有异常(甚至是已处理的异常)?

转载 作者:行者123 更新时间:2023-12-03 14:43:24 29 4
gpt4 key购买 nike

我想使用 JCLDebug 记录引发的所有异常,包括已处理的异常。

可以这样做吗?

最佳答案

它不是基于 JCL,但它是完全开源的,并且适用于 Delphi 5 到 XE。

这个logging mechanism能够拦截任何异常。

事实上,从 Delphi 6 开始,您可以在 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,我 had to patch the VCL in-process ,因为没有全局异常拦截器。

关于delphi - 有没有办法用 JCLDebug 捕获所有异常(甚至是已处理的异常)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6415242/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com