I've recently updated my watchdog wrapper script which starts D services to use gdb and disable rt_trapExceptions. My intention was to bypass D's standard exception handler and let gdb handle uncaught exceptions, and perhaps print better stack traces including function arguments and line numbers. However, this was the result:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000531f7c in rt.deh2.terminate() ()
#0  0x0000000000531f7c in rt.deh2.terminate() ()
No symbol table info available.
#1  0x00000000004ffebf in _d_throwc ()
No symbol table info available.
#2  0x0000000000000002 in ?? ()
No symbol table info available.
#3  0x0000000000000002 in ?? ()
No symbol table info available.
#4  0x000000000078e030 in ?? ()
No symbol table info available.
#5  0x000000000000001d in ?? ()
No symbol table info available.
#6  0x0000000000000002 in ?? ()
No symbol table info available.
#7  0x0000000000000000 in ?? ()
No symbol table info available.

I assume that the stack frames under _d_throwc are not accessible because _d_throwc does not create a stack frame, as Druntime is built with -release but not -gs. (To clarify, stack frames are disabled by -release unless -gs is specified, in which case they're always emitted.)

Should the Phobos and Druntime makefiles be changed to include -gs in the release DFLAGS? I haven't noticed any difference in performance from timing the Druntime unittests. In theory, enabling it should provide a better out-of-the-box debugging experience at a negligible performance/filesize cost.

Reply via email to