From da7b87cb80fbeaf95da64250f833a12b8b882bd4 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Wed, 13 Jan 2010 12:32:17 +0100 Subject: [PATCH] win32 specific code start (not done) --- sys_shared.c | 62 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/sys_shared.c b/sys_shared.c index 3ed83da2..c0d96ad9 100644 --- a/sys_shared.c +++ b/sys_shared.c @@ -25,11 +25,52 @@ char *Sys_TimeString(const char *timeformat) return sys_timestring; } -#if defined(__linux__) +#if defined(__linux__) || defined(MACOSX) + +#include +static void Sys_Backtrace(void) +{ + void *tracebuf[64]; + int n = backtrace(tracebuf, sizeof(tracebuf) / sizeof(*tracebuf)); + char **trace = backtrace_symbols(tracebuf, n); + int i; + Con_Printf("Backtrace:\n"); + for(i = 0; i < n; ++i) + Con_Printf("%2d: %s\n", i, trace[i]); +} + +#elif defined(WIN32) + +// http://gcc.gnu.org/ml/java/2002-04/msg00331.html +int backtrace (void **__array, int __size) +{ + register void *_ebp __asm__ ("ebp"); + register void *_esp __asm__ ("esp"); + unsigned int *rfp; + int i=0; + for (rfp = *(unsigned int**)_ebp; rfp && i < __size; rfp = *(unsigned int **)rfp) + { + int diff = *rfp - (unsigned int)rfp; + if ((void*)rfp < _esp || diff > 4 * 1024 || diff < 0) + break; + __array[i++] = (void*)(rfp[1]-4); + } + return i; +} + +static void Sys_Backtrace(void) +{ + void *tracebuf[64]; + int n = backtrace(tracebuf, sizeof(tracebuf) / sizeof(*tracebuf)); + char **trace = backtrace_symbols(tracebuf, n); + int i; + Con_Printf("Backtrace:\n"); + for(i = 0; i < n; ++i) + Con_Printf("%2d: %s\n", i, trace[i]); +} + +#elif 0 -#if 0 -// dladdr way -// may be compatible to more systems #define _GNU_SOURCE #include static qboolean Sys_PrintSymbol(void *addr) @@ -55,19 +96,6 @@ void Sys_Backtrace(void) // this function must not be static so gcc can export i if(Sys_PrintSymbol(a[i])) return; } -#else -#include -static void Sys_Backtrace(void) -{ - void *tracebuf[64]; - int n = backtrace(tracebuf, sizeof(tracebuf) / sizeof(*tracebuf)); - char **trace = backtrace_symbols(tracebuf, n); - int i; - Con_Printf("Backtrace:\n"); - for(i = 0; i < n; ++i) - Con_Printf("%2d: %s\n", i, trace[i]); -} -#endif #else -- 2.39.2