Add debugBacktrace() for easier debugging.

master
Cyp 2011-12-04 17:31:48 +01:00
parent e5d7318b0c
commit a58591d74c
2 changed files with 24 additions and 0 deletions

View File

@ -33,6 +33,10 @@
#include "lib/framework/wzapp_c.h"
#include "lib/gamelib/gtime.h"
#ifdef WZ_OS_LINUX
#include <execinfo.h> // Nonfatal runtime backtraces.
#endif //WZ_OS_LINUX
extern void NotifyUserOfError(char *); // will throw up a notifier on error
#define MAX_LEN_LOG_LINE 512
@ -477,6 +481,23 @@ void _debug( code_part part, const char *function, const char *str, ... )
useInputBuffer1 = !useInputBuffer1; // Swap buffers
}
void _debugBacktrace(code_part part)
{
#ifdef WZ_OS_LINUX
void *btv[20];
unsigned num = backtrace(btv, sizeof(btv)/sizeof(*btv));
char **btc = backtrace_symbols(btv, num);
unsigned i;
for (i = 1; i + 2 < num; ++i) // =1: Don't print "src/warzone2100(syncDebugBacktrace+0x16) [0x6312d1]". +2: Don't print last two lines of backtrace such as "/lib/libc.so.6(__libc_start_main+0xe6) [0x7f91e040ea26]", since the address varies (even with the same binary).
{
_debug(part, "BT", "%s", btc[i]);
}
free(btc);
#else
// debugBacktrace not implemented.
#endif
}
bool debugPartEnabled(code_part codePart)
{
return enabled_debug[codePart];

View File

@ -256,6 +256,9 @@ bool debug_enable_switch(const char *str);
void _debug( code_part part, const char *function, const char *str, ...)
WZ_DECL_FORMAT(printf, 3, 4);
#define debugBacktrace(part, ...) do { if (enabled_debug[part]) { _debug(part, __FUNCTION__, __VA_ARGS__); _debugBacktrace(part); }} while(0)
void _debugBacktrace(code_part part);
/** Global to keep track of which game object to trace. */
extern UDWORD traceID;