Enable stack traces with ghci -fexternal-interpreter -prof

Authored by simonmar.


Enable stack traces with ghci -fexternal-interpreter -prof

The main goal here is enable stack traces in GHCi. After this change,
if you start GHCi like this:

ghci -fexternal-interpreter -prof

(which requires packages to be built for profiling, but not GHC
itself) then the interpreter manages cost-centre stacks during
execution and can produce a stack trace on request. Call locations
are available for all interpreted code, and any compiled code that was
built with the -fprof-auto familiy of flags.

There are a couple of ways to get a stack trace:

  • error/undefined automatically get one attached
  • Debug.Trace.traceStack can be used anywhere, and prints the current stack

Because the interpreter is running in a separate process, only the
interpreted code is running in profiled mode and the compiler itself
isn't slowed down by profiling.

The GHCi debugger still doesn't work with -fexternal-interpreter,
although this patch gets it a step closer. Most of the functionality
of breakpoints is implemented, but the runtime value introspection is
still not supported.

Along the way I also did some refactoring and added type arguments to
the various remote pointer types in GHCi.RemotePtr, so there's
better type safety and documentation in the bridge code between GHC
and ghc-iserv.

Test Plan: validate

Reviewers: bgamari, ezyang, austin, hvr, goldfire, erikd

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1747

GHC Trac Issues: Trac #11047, Trac #11100