Here are even more interfaces than the three the author listed (libunwind, __register_frame, GDB):
- oprofile has a JIT interface: http://oprofile.sourceforge.net/doc/devel/jit-interface.html
- perf has a JIT interface: https://github.com/torvalds/linux/blob/master/tools/perf/Doc...
I wrote a blog article about the craziness around unwinding a few years back: http://blog.reverberate.org/2013/05/deep-wizardry-stack-unwi...
One of the questions I answer in my article which isn't addressed as much here is: why do we care about generating backtraces in the first place? It might seem obvious, but I identified four separate reasons which are all important: to support runtime exceptions (a la C++), to offer backtraces in debuggers, to sample the stack for profilers, and to print a backtrace from the program itself. So if you have a JIT and you don't offer proper backtraces, your users are going to be annoyed when they use any of these tools.