From cfeb0626ccc6f335d95089bf6c4f7baecdce9c8a Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Thu, 27 Oct 2022 18:42:07 +0200 Subject: Added BOX64_SHOWBT env. var. to have a backtrace on segfault --- docs/USAGE.md | 5 +++++ src/include/debug.h | 1 + src/libtools/signals.c | 24 ++++++++++++++++++++++++ src/main.c | 13 ++++++++++--- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/docs/USAGE.md b/docs/USAGE.md index 26bfcdc2..f71daa17 100755 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -90,6 +90,11 @@ Show Segfault signal even if a signal handler is present * 0 : Don"t force show the SIGSEGV analysis (Default.) * 1 : Show SIGSEGV detail, even if a signal handler is present +#### BOX64_SHOWBT +Show some Backtrace (Nativ e and Emulated) whgen a signal (SEGV, ILL or BUS) is caught + * 0 : Don"t show backtraces (Default.) + * 1 : Show Backtrace detail (for native, box64 is rename as the x86_64 binary run) + #### BOX64_X11THREADS Call XInitThreads when loading X11. (This is mostly for old Loki games with the Loki_Compat library.) * 0 : Don't force call XInitThreads. (Default.) diff --git a/src/include/debug.h b/src/include/debug.h index 4efcc7bb..c03fc0b0 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -47,6 +47,7 @@ extern int box64_nopulse; // disabling the use of wrapped pulseaudio extern int box64_nogtk; // disabling the use of wrapped gtk extern int box64_novulkan; // disabling the use of wrapped vulkan extern int box64_showsegv; // show sigv, even if a signal handler is present +extern int box64_showbt; // show a backtrace if a signal is caught extern uintptr_t fmod_smc_start, fmod_smc_end; // to handle libfmod (from Unreal) SMC (self modifying code) extern uint32_t default_gs; extern int jit_gdb; // launch gdb when a segfault is trapped diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 6dcfb8b0..dfc351d6 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "box64context.h" #include "debug.h" @@ -1007,6 +1008,29 @@ exit(-1); } } } + if(box64_showbt) { + // show native bt + #define BT_BUF_SIZE 100 + int nptrs; + void *buffer[BT_BUF_SIZE]; + char **strings; + nptrs = backtrace(buffer, BT_BUF_SIZE); + strings = backtrace_symbols(buffer, nptrs); + if(strings) { + for (int j = 0; j < nptrs; j++) + printf_log(log_minimum, "NativeBT: %s\n", strings[j]); + free(strings); + } + extern int my_backtrace(x64emu_t* emu, void** buffer, int size); // in wrappedlibc + extern char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size); + nptrs = my_backtrace(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_minimum, "EmulatedBT: %s\n", strings[j]); + free(strings); + } + } #ifdef DYNAREC uint32_t hash = 0; if(db) diff --git a/src/main.c b/src/main.c index 2dfc0caf..dcd5d92c 100755 --- a/src/main.c +++ b/src/main.c @@ -90,6 +90,7 @@ int box64_nopulse = 0; int box64_nogtk = 0; int box64_novulkan = 0; int box64_showsegv = 0; +int box64_showbt = 0; char* libGL = NULL; uintptr_t fmod_smc_start = 0; uintptr_t fmod_smc_end = 0; @@ -632,6 +633,15 @@ void LoadLogEnv() if(box64_showsegv) printf_log(LOG_INFO, "Show Segfault signal even if a signal handler is present\n"); } + p = getenv("BOX64_SHOWBT"); + if(p) { + if(strlen(p)==1) { + if(p[0]>='0' && p[0]<='0'+1) + box64_showbt = p[0]-'0'; + } + if(box64_showbt) + printf_log(LOG_INFO, "Show a Backtrace when a Segfault signal is caught\n"); + } box64_pagesize = sysconf(_SC_PAGESIZE); if(!box64_pagesize) box64_pagesize = 4096; @@ -1053,9 +1063,6 @@ int main(int argc, const char **argv, char **env) { exit(0); } - // init random seed - srandom(time(NULL)); - // check BOX64_LOG debug level LoadLogEnv(); char* bashpath = NULL; -- cgit 1.4.1