about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xdocs/USAGE.md5
-rwxr-xr-xsrc/include/debug.h1
-rwxr-xr-xsrc/libtools/signals.c24
-rwxr-xr-xsrc/main.c13
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 <setjmp.h>
 #include <sys/mman.h>
 #include <pthread.h>
+#include <execinfo.h>
 
 #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;