Index: vm/vmcore/src/stack/stack_dump.cpp =================================================================== --- vm/vmcore/src/stack/stack_dump.cpp (revision 451885) +++ vm/vmcore/src/stack/stack_dump.cpp (working copy) @@ -26,6 +26,7 @@ #include "jit_intf_cpp.h" #include "Class.h" #include "stack_trace.h" +#include "interpreter_exports.h" #ifdef PLATFORM_NT @@ -210,11 +211,14 @@ } void st_print_stack(Registers* regs) { + if(interpreter_enabled()) { + interpreter.stack_dump(get_thread_ptr()); + return; + } jint num_frames; native_frame_t* frames; num_frames = walk_native_stack_registers(regs, p_TLS_vmthread, -1, NULL); frames = (native_frame_t*) STD_ALLOCA(sizeof(native_frame_t) * num_frames); - num_frames = walk_native_stack_registers(regs, p_TLS_vmthread, num_frames, frames); StackIterator* si = si_create_from_native(); fprintf(stderr, "Stack trace:\n"); Index: vm/vmcore/src/util/linux/signals_ia32.cpp =================================================================== --- vm/vmcore/src/util/linux/signals_ia32.cpp (revision 451885) +++ vm/vmcore/src/util/linux/signals_ia32.cpp (working copy) @@ -601,9 +601,17 @@ Registers regs; ucontext_t *uc = (ucontext_t *)context; linux_ucontext_to_regs(®s, uc); + + // reset handler to avoid loop in case st_print_stack fails + struct sigaction sa; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = SIG_DFL; + sigaction(SIGABRT, &sa, NULL); + st_print_stack(®s); - signal(signum, 0); + signal(signum, SIG_DFL); } /*