[GHC] #3693: Show stack traces

GHC ghc-devs at haskell.org
Wed Aug 7 17:14:49 CEST 2013


#3693: Show stack traces
-------------------------------------+------------------------------------
        Reporter:  jpet              |            Owner:
            Type:  feature request   |           Status:  new
        Priority:  normal            |        Milestone:  7.6.2
       Component:  Runtime System    |          Version:  6.10.4
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------
Changes (by scpmw):

 * difficulty:   => Unknown


Comment:

 Some progress on this - our [https://github.com/scpmw/ghc/commits
 /profiling-ncg DWARF / profiling branch] now generates DWARF using NCG,
 complete with .debug_frame unwind records that are at least valid at the
 start of blocks. That's enough for GDB to backtrace:
 {{{
 $ gdb stack-trace -q
 Reading symbols from tack-trace...done.
 (gdb) break stg_raisezh
 Breakpoint 1 at 0x68f2f8: file rts/Exception.cmm, line 433.
 (gdb) run
 Starting program: stack-trace
 Breakpoint 1, stg_raisezh () at rts/Exception.cmm:433
 433     {
 (gdb) bt
 #0  stg_raisezh () at rts/Exception.cmm:433
 #1  0x0000000000694330 in ?? () at rts/Updates.cmm:57
 #2  0x00000000004047a0 in Main_zdwfibzuerr_info () at stack-trace.hs:7
 #3  0x0000000000404770 in Main_zdwfibzuerr_info () at stack-trace.hs:5
 }}}

 Note however that we end up with "??" sometimes due to GDB looking at IP-1
 for information about the supposed "call" instruction. With tables next to
 code, that is guaranteed to be inside the info table, so right now I just
 declare the info table as belonging to a source file so at least the "at
 bla" bit is correct.

 Furthermore, using Max' patch and some more or less involved lookups we
 can do the backtracking from the RTS as well, which then looks roughly as
 follows ([https://github.com/scpmw/ghc/commits/stack-tracing code here]):
 {{{
 stack-trace: Barf!
 Loading debug data...
 Stack trace:
    0: stg_bh_upd_frame_ret (at rts/Updates.cmm:86:1-91:2)
    1: fib_err (at stack-trace.hs:7:37-7:42)
    2: fib_err (at stack-trace.hs:7:37-7:42)
    3: fib_err (at stack-trace.hs:7:37-7:42)
    4: fib_err (at stack-trace.hs:7:37-7:42)
 }}}

 Here the RTS is reading in DWARF from our own executable as well as
 libraries using libdwarf, then looking up the code pointers to get labels.
 These are then looked up in the debug info table we normally use for
 profiling, which yields (amongst other things) references to the original
 source code.

 Caveats:

 * The quality of the result obviously depends a lot on what we can
 actually find on the stack. Ironically, higher optimization levels
 sometimes produce better results, as there's a higher change for functions
 to have specialized return code.

 * Only works on Linux at this point - main sticking point would be undoing
 relocation and finding the right files to read DWARF from (right now I
 read /proc/self/maps for that).

 * Depends on a significant amount of code from my profiling-ncg branch,
 which has a few change that might be controversial - such as adding
 CmmTick and CmmContext to CmmNode instead of tracking source code ticks
 per-block or per-procedure. Reasoning is basically that this solution
 seems to have the least overhead on Cmm optimizations.

 Something I am wondering right now is what kind of API would be most
 appropriate for this kind of thing. This comes down pretty much to how
 much extra functionality we want - we would probably want to be able to
 request stack dumps manually, but would we want to be able to make the
 stack contents transparent to the Haskell program? If yes we could convert
 stack dumps into a Haskell lists, possibly offering whatever extra bits of
 information while we're at it (e.g. Core references). On the other hand
 that would be really, really impure - and quite some work to boot.

 Thoughts? Any particular features people would like to see?

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/3693#comment:44>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler




More information about the ghc-tickets mailing list