diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-24 22:40:39 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-24 16:40:39 +0200 |
| commit | d8212fab4840560f9ebac066319d50da8fbbbc97 (patch) | |
| tree | 7370407861a4cb57ea60fe450ced27bb980b242d | |
| parent | 740f4a19dc1c5110bfd20ef9f73945763f2467b5 (diff) | |
| download | box64-d8212fab4840560f9ebac066319d50da8fbbbc97.tar.gz box64-d8212fab4840560f9ebac066319d50da8fbbbc97.zip | |
[SIGNAL] Better signal logging when trace enabled (#2572)
* [SIGNAL] Better signal logging when trace enabled * fix
| -rw-r--r-- | src/libtools/signals.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 1cbfcb7a..36e57104 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -34,6 +34,7 @@ #include "custommem.h" #include "bridge.h" #include "khash.h" +#include "x64trace.h" #ifdef DYNAREC #include "dynablock.h" #include "../dynarec/dynablock_private.h" @@ -2135,10 +2136,18 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % for (int i=0; i<6; ++i) printf_log_prefix(0, log_minimum, "%s:0x%04x ", seg_name[i], emu->segs[i]); } + zydis_dec_t* dec = emu->segs[_CS] == 0x23 ? my_context->dec32 : my_context->dec; if(sig==SIGILL) { - printf_log_prefix(0, log_minimum, " opcode=%02X %02X %02X %02X %02X %02X %02X %02X (%02X %02X %02X %02X %02X)\n", ((uint8_t*)pc)[0], ((uint8_t*)pc)[1], ((uint8_t*)pc)[2], ((uint8_t*)pc)[3], ((uint8_t*)pc)[4], ((uint8_t*)pc)[5], ((uint8_t*)pc)[6], ((uint8_t*)pc)[7], ((uint8_t*)x64pc)[0], ((uint8_t*)x64pc)[1], ((uint8_t*)x64pc)[2], ((uint8_t*)x64pc)[3], ((uint8_t*)x64pc)[4]); + printf_log_prefix(0, log_minimum, " opcode=%02X %02X %02X %02X %02X %02X %02X %02X ", ((uint8_t*)pc)[0], ((uint8_t*)pc)[1], ((uint8_t*)pc)[2], ((uint8_t*)pc)[3], ((uint8_t*)pc)[4], ((uint8_t*)pc)[5], ((uint8_t*)pc)[6], ((uint8_t*)pc)[7]); + if (dec) + printf_log_prefix(0, log_minimum, "(%s)\n", DecodeX64Trace(dec, x64pc, 1)); + else + printf_log_prefix(0, log_minimum, "(%02X %02X %02X %02X %02X)\n", ((uint8_t*)x64pc)[0], ((uint8_t*)x64pc)[1], ((uint8_t*)x64pc)[2], ((uint8_t*)x64pc)[3], ((uint8_t*)x64pc)[4]); } else if(sig==SIGBUS || (sig==SIGSEGV && (x64pc!=(uintptr_t)addr) && (pc!=addr)) && (getProtection_fast(x64pc)&PROT_READ) && (getProtection_fast((uintptr_t)pc)&PROT_READ)) { - printf_log_prefix(0, log_minimum, " %sopcode=%02X %02X %02X %02X %02X %02X %02X %02X (opcode=%08x)\n", (emu->segs[_CS]==0x23)?"x86":"x64", ((uint8_t*)x64pc)[0], ((uint8_t*)x64pc)[1], ((uint8_t*)x64pc)[2], ((uint8_t*)x64pc)[3], ((uint8_t*)x64pc)[4], ((uint8_t*)x64pc)[5], ((uint8_t*)x64pc)[6], ((uint8_t*)x64pc)[7], *(uint32_t*)pc); + if (dec) + printf_log_prefix(0, log_minimum, " %sopcode=%s; native opcode=%08x\n", (emu->segs[_CS] == 0x23) ? "x86" : "x64", DecodeX64Trace(dec, x64pc, 1), *(uint32_t*)pc); + else + printf_log_prefix(0, log_minimum, " %sopcode=%02X %02X %02X %02X %02X %02X %02X %02X (opcode=%08x)\n", (emu->segs[_CS] == 0x23) ? "x86" : "x64", ((uint8_t*)x64pc)[0], ((uint8_t*)x64pc)[1], ((uint8_t*)x64pc)[2], ((uint8_t*)x64pc)[3], ((uint8_t*)x64pc)[4], ((uint8_t*)x64pc)[5], ((uint8_t*)x64pc)[6], ((uint8_t*)x64pc)[7], *(uint32_t*)pc); } else { printf_log_prefix(0, log_minimum, "\n"); } |