This is the mail archive of the
mailing list for the GCC project.
Re: GCC stack backtraces
On 08/29/2012 12:43 AM, Janne Blomqvist wrote:
On Wed, Aug 29, 2012 at 10:22 AM, Ian Lance Taylor <firstname.lastname@example.org> wrote:
I've spent the last couple of days working on a stack backtrace library.[snip]
It uses the GCC unwind interface to collect a stack trace, and parses
DWARF debug info to get file/line/function information.
I expect to use this code not just for GCC proper, but also for libgo
(currently libgo uses Go code to parse DWARF, but that is not very
satisfactory as that code is only available if it has been imported into
the program). So I put it under a BSD license, although that is open
for discussion. Also in case it finds more uses elsewhere I wrote it in
reasonably portable C rather than C++.
Does this seem like something we could usefully add to GCC? Does
anybody see any big problems with it?
I haven't looked at the code, but if it is async-signal-safe it could
be interesting for gfortran. Currently in libgfortran we have a
backtracing routine, originally written by FX Coudert IIRC, since
rewritten by yours truly a few times, that uses _Unwind_Backtrace()
from libgcc and then pipes the output via addr2line, if found. Since
it's invoked from a signal handler when the program (user program, not
the compiler!) crashes, it needs to be async-signal-safe. AFAIK the
current implementation *should* fulfill that requirement. But
something that would be async-signal-safe and won't need addr2line to
get symbolic info would be a nice improvement,
libgcj also uses this technique. If this were merged, it would be
really nice to retrofit libgcj to use it as well.
Having this capability available from C and C++ code would also be
really nice. Several times in the past I have hacked together an
unwinder by calling _Unwind_Backtrace(), and then decoded the traces
off-line using addr2line. An easy, low-overhead way to add
function/line number information to a trace would be quite welcome.
I would almost say to put it in libgcc along side of
_Unwind_Backtrace(), but that doesn't seem the proper place for it. It
would be very convenient though.