diff --git a/rtl/inc/system.inc b/rtl/inc/system.inc index 64d9218676..9f15dbf768 100644 --- a/rtl/inc/system.inc +++ b/rtl/inc/system.inc @@ -1067,6 +1067,7 @@ begin end; +{$ifndef FPC_SYSTEM_HAS_CAPTUREBACKTRACE} function CaptureBacktrace(skipframes,count:sizeint;frames:PCodePointer):sizeint; var curr_frame,prev_frame: pointer; @@ -1095,6 +1096,7 @@ begin else result:=i; end; +{$endif FPC_SYSTEM_HAS_CAPTUREBACKTRACE} Procedure HandleErrorAddrFrame (Errno : longint;addr : CodePointer; frame : Pointer);[public,alias:'FPC_BREAK_ERROR']; {$ifdef CPUI386} register; {$endif} diff --git a/rtl/win64/seh64.inc b/rtl/win64/seh64.inc index 8bd28bbfba..7a4aac7de5 100644 --- a/rtl/win64/seh64.inc +++ b/rtl/win64/seh64.inc @@ -213,6 +213,12 @@ type end; +function CaptureBacktrace(skipframes,count:sizeint;frames:PCodePointer):sizeint; +begin + { skipframes is increased because this function adds a call level } + Result:=RtlCaptureStackBackTrace(skipframes+1,count,frames^,nil); +end; + { note: context must be passed by value, so modifications are made to a local copy } function GetBacktrace(Context: TContext; StartingFrame: Pointer; out Frames: PPointer): Longint; var diff --git a/rtl/win64/system.pp b/rtl/win64/system.pp index 4dabd72386..3bdb41a1db 100644 --- a/rtl/win64/system.pp +++ b/rtl/win64/system.pp @@ -31,6 +31,7 @@ interface {$ifdef FPC_USE_WIN64_SEH} {$define FPC_SYSTEM_HAS_RAISEEXCEPTION} {$define FPC_SYSTEM_HAS_RERAISE} + {$define FPC_SYSTEM_HAS_CAPTUREBACKTRACE} {$endif FPC_USE_WIN64_SEH} { include system-independent routine headers }