diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libtools/signals.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 820ed1d3..395334e9 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1946,6 +1946,36 @@ void emit_signal(x64emu_t* emu, int sig, void* addr, int code) elfname = ElfName(elf); printf_log(LOG_NONE, "Emit Signal %d at IP=%p(%s / %s) / addr=%p, code=0x%x\n", sig, (void*)R_RIP, x64name?x64name:"???", elfname?elfname:"?", addr, code); print_cycle_log(LOG_INFO); + + if((box64_showbt || sig==SIGABRT) && box64_log>=LOG_INFO) { + // show native bt + #define BT_BUF_SIZE 100 + int nptrs; + void *buffer[BT_BUF_SIZE]; + char **strings; + +#ifndef ANDROID + nptrs = backtrace(buffer, BT_BUF_SIZE); + strings = backtrace_symbols(buffer, nptrs); + if(strings) { + for (int j = 0; j < nptrs; j++) + printf_log(LOG_INFO, "NativeBT: %s\n", strings[j]); + free(strings); + } else + printf_log(LOG_INFO, "NativeBT: none (%d/%s)\n", errno, strerror(errno)); +#endif + extern int my_backtrace_ip(x64emu_t* emu, void** buffer, int size); // in wrappedlibc + extern char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size); + // save and set real RIP/RSP + nptrs = my_backtrace_ip(emu, buffer, BT_BUF_SIZE); + strings = my_backtrace_symbols(emu, (uintptr_t*)buffer, nptrs); + if(strings) { + for (int j = 0; j < nptrs; j++) + printf_log(LOG_INFO, "EmulatedBT: %s\n", strings[j]); + free(strings); + } else + printf_log(LOG_INFO, "EmulatedBT: none\n"); + } printf_log(LOG_NONE, DumpCPURegs(emu, R_RIP, emu->segs[_CS]==0x23)); printf_log(LOG_NONE, "Emu Stack: %p 0x%lx%s\n", emu->init_stack, emu->size_stack, emu->stack2free?" owned":""); //if(!elf) { |