#ifndef WIN32 #include <string.h> #include <dlfcn.h> /* Backtracing courtesy of Kiasyn and Clifford Wolf (http://www.clifford.at/cfun/elfstuff/) We can't do this while the mud is booting up :b causes strange errors. */ extern bool fBootDb; #define BACKTRACE() \ if ( !fBootDb ) \ { \ Dl_info dli; \ int backx = 0; \ void *returnaddr; \ for ( backx = 0; backx < 4; backx++ ) \ { \ returnaddr = (void *) 1; \ switch( backx ) \ { \ case 0: returnaddr = __builtin_return_address(0); break; \ case 1: returnaddr = __builtin_return_address(1); break; \ case 2: returnaddr = __builtin_return_address(2); break; \ case 3: returnaddr = __builtin_return_address(3); break; \ case 4: returnaddr = __builtin_return_address(4); break; \ default: returnaddr = 0; break; \ } \ if ( !returnaddr ) \ break; \ dladdr( returnaddr, &dli); \ if ( !&dli ) \ break; \ debug( " ... backtrace: %*s called by %p #%d [ %s(%p) %s(%p) ].", \ (int)strlen(__func__ ), backx == 0 ? __func__ : "...", \ returnaddr, backx, \ strrchr(dli.dli_fname, '/') ? strrchr( dli.dli_fname, '/')+1 : dli.dli_fname, \ dli.dli_fbase, dli.dli_sname, dli.dli_saddr ); \ } \ } #else define BACKTRACE() do { debug( "Backtrace not enabled under windows" ); } while(0) endif