/** * Contains some simul_efuns. * @author Pinkfish */ /** * This method returns out the call stack traces. It is usually * called in the error handling routines in the master object * but it can be used elsewhere for debugging purposes. You * can see the results of this function in /log/runtime and * /log/catch. * @return call stack trace */ string back_trace() { string ret, *progs, *funcs; mixed obs; int i, sz; progs = map( call_stack(0), (: ( $1[<1] == '>' ? $1 : $1[0..<3] ) :) ); obs = call_stack(1); funcs = call_stack(2); i = sz = sizeof(progs); ret = "Time: "+ctime(time())+"\n"; while( i-- > 1 ) { mixed name; if( objectp(obs[i]) ) { if( !stringp( name = obs[i]->query_name() ) ) { if( sizeof( name ) && stringp( name[0] ) ) name = name[0]; else name = 0; } obs[i] = file_name( obs[i] ); } else { obs[i] = "null"; } if( obs[i] == progs[i] ) ret += sprintf("(%i) '%s' in %s\n", sz - i, funcs[i], progs[i] ); else ret += sprintf("(%i) '%s' in %s (%s)\n", sz - i, funcs[i], obs[i], progs[i] ); if( name ) ret += sprintf("Object name: %O\n", name ); } return ret; } /* back_trace() */