[fpc-devel] Stack dump with possible segfault
Johann Glaser
Johann.Glaser at gmx.at
Tue May 13 21:55:36 CEST 2014
Hi again!
Am Montag, den 12.05.2014, 23:33 +0200 schrieb Johann Glaser:
> Hi!
>
> I'm working on a project with an external library (libtcl, it is written
> in C) which creates some problems with back traces for exceptions.
>
> If a custom TCL command raises an exception, I catch it and use the
> function DumpExceptionBackTrace to print the back trace. This function
> uses RaiseList which returns the ExceptObjectStack pointer. The stack
> frame information is filled by fpc_PushExceptObj in except.inc using the
> functions get_frame, get_caller_addr and get_caller_frame.
>
> These three functions are also used by dump_stack which can be used at
> any point in the code (outside of exceptions).
>
> These three functions assume, that the stack frame is stored in the RBP
> register (x86_64 architecture) and that every function call starts with
> these two assembler instructions
> push %rbp
> mov %rsp,%rbp
> which leads to the stack layout of the return address (pushed by the
> "call" instruction) followed by the RBP value.
>
> As this is true for FreePascal code (I guess), this doesn't necessarily
> hold for external libraries as the TCL library mentioned above.
News on that front: Today I investigated a duplicate key exception in
FGL.TFPSMaps.Add(AKey: Pointer): Integer. In the current Debian package
fp-units-rtl-2.6.4 2.6.4+dfsg-2 this seems to be compiled with looots of
optimization and without stack frame:
0000000000001918 <FGL_TFPSMAP_$__ADD$POINTER$$LONGINT>:
1918: 48 81 ec 18 01 00 00 sub $0x118,%rsp
191f: 48 89 9c 24 08 01 00 mov %rbx,0x108(%rsp)
1926: 00
1927: 4c 89 a4 24 10 01 00 mov %r12,0x110(%rsp)
192e: 00
192f: 48 89 fb mov %rdi,%rbx
1932: 49 89 f4 mov %rsi,%r12
Even GDB couldn't trace back the stack there. :-O
Bye
Hansi
More information about the fpc-devel
mailing list