X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=prvm_exec.c;h=8adee10ff3fc3a8b654513711b74c7e817a1dcf0;hp=80287cab1ae37ea8054bf2f573df5409fcfc38de;hb=aec7c7012b72c33284cd70b9aa313c6873104eb2;hpb=2a28f051d86861fb4656d3a46c40bf2a736b21e5 diff --git a/prvm_exec.c b/prvm_exec.c index 80287cab..8adee10f 100644 --- a/prvm_exec.c +++ b/prvm_exec.c @@ -265,6 +265,37 @@ void PRVM_StackTrace (void) } } +void PRVM_ShortStackTrace(char *buf, size_t bufsize) +{ + mfunction_t *f; + int i; + + if(prog) + { + dpsnprintf(buf, bufsize, "(%s) ", prog->name); + } + else + { + strlcpy(buf, "", sizeof(buf)); + return; + } + + prog->stack[prog->depth].s = prog->xstatement; + prog->stack[prog->depth].f = prog->xfunction; + for (i = prog->depth;i > 0;i--) + { + f = prog->stack[i].f; + + if(strlcat(buf, + f + ? va("%s:%s(%i) ", PRVM_GetString(f->s_file), PRVM_GetString(f->s_name), prog->stack[i].s - f->first_statement) + : " ", + bufsize + ) >= bufsize) + break; + } +} + void PRVM_CallProfile () { @@ -424,17 +455,27 @@ void PRVM_PrintState(void) } extern sizebuf_t vm_tempstringsbuf; +extern cvar_t prvm_errordump; +void Host_Savegame_to (const char *name); void PRVM_Crash(void) { if (prog == NULL) return; + prog->funcoffsets.SV_Shutdown = 0; // don't call SV_Shutdown on crash + if( prog->depth > 0 ) { Con_Printf("QuakeC crash report for %s:\n", PRVM_NAME); PRVM_PrintState(); } + if(prvm_errordump.integer) + { + // make a savegame + Host_Savegame_to(va("crash-%s.dmp", PRVM_NAME)); + } + // dump the stack so host_error can shutdown functions prog->depth = 0; prog->localstack_used = 0; @@ -545,7 +586,9 @@ PRVM_ExecuteProgram #define OPA ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->a]) #define OPB ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->b]) #define OPC ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->c]) +#ifdef PRVM_BOUNDSCHECK_CVAR extern cvar_t prvm_boundscheck; +#endif extern cvar_t prvm_traceqc; extern cvar_t prvm_statementprofiling; extern sizebuf_t vm_tempstringsbuf; @@ -594,7 +637,9 @@ chooseexecprogram: if (prvm_statementprofiling.integer) { #define PRVMSTATEMENTPROFILING 1 +#ifdef PRVM_BOUNDSCHECK_CVAR if (prvm_boundscheck.integer) +#endif { #define PRVMBOUNDSCHECK 1 if (prog->trace) @@ -609,6 +654,7 @@ chooseexecprogram: } #undef PRVMBOUNDSCHECK } +#ifdef PRVM_BOUNDSCHECK_CVAR else { if (prog->trace) @@ -622,11 +668,14 @@ chooseexecprogram: #include "prvm_execprogram.h" } } +#endif #undef PRVMSTATEMENTPROFILING } else { +#ifdef PRVM_BOUNDSCHECK_CVAR if (prvm_boundscheck.integer) +#endif { #define PRVMBOUNDSCHECK 1 if (prog->trace) @@ -641,6 +690,7 @@ chooseexecprogram: } #undef PRVMBOUNDSCHECK } +#ifdef PRVM_BOUNDSCHECK_CVAR else { if (prog->trace) @@ -654,6 +704,7 @@ chooseexecprogram: #include "prvm_execprogram.h" } } +#endif } cleanup: