about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-18 17:15:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-18 17:15:21 +0100
commit631da8a53231fb725fa9ed4db254c60b53621024 (patch)
tree95da796e7926f2999c9c8fb8611f83a81998adb3 /src/libtools
parentf80886fd68893b82196cd9bd0f3faa36436e1b22 (diff)
downloadbox64-631da8a53231fb725fa9ed4db254c60b53621024.tar.gz
box64-631da8a53231fb725fa9ed4db254c60b53621024.zip
Added an helper function to abort and backtrace (used in [BOX32] when pointer address not 32bits compatible)
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/signals.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 290452a2..04702fe6 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -2376,6 +2376,40 @@ EXPORT void my_makecontext(x64emu_t* emu, void* ucp, void* fnc, int32_t argc, in
     u->uc_mcontext.gregs[X64_RSP] = (uintptr_t)rsp;
 }
 
+void box64_abort() {
+    if(box64_showbt && LOG_INFO<=box64_log) {
+            // show native bt
+            #define BT_BUF_SIZE 100
+            int nptrs;
+            void *buffer[BT_BUF_SIZE];
+            char **strings;
+            x64emu_t* emu = thread_get_emu();
+
+#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);
+            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");
+        }
+    abort();
+}
+
+
 EXPORT int my_swapcontext(x64emu_t* emu, void* ucp1, void* ucp2)
 {
 //    printf_log(LOG_NONE, "Warning: call to unimplemented swapcontext\n");