remove GetThreadBacktraceContext; GetBacktrace( x, NULL ) gets the current backtrace

This commit is contained in:
Glenn Maynard
2004-03-19 09:25:45 +00:00
parent 361a88f4b9
commit 5dd5bda234
5 changed files with 20 additions and 28 deletions
+9 -19
View File
@@ -22,7 +22,7 @@ void GetSignalBacktraceContext( BacktraceContext *ctx, const ucontext_t *uc )
ctx->pid = GetCurrentThreadId();
}
void GetCurrentBacktraceContext( BacktraceContext *ctx )
static void GetCurrentBacktraceContext( BacktraceContext *ctx )
{
register void *esp __asm__ ("esp");
ctx->esp = (long) esp;
@@ -30,18 +30,6 @@ void GetCurrentBacktraceContext( BacktraceContext *ctx )
ctx->ebp = (long) __builtin_frame_address(0);
}
int GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx )
{
ctx->pid = ThreadID;
if( ThreadID != GetCurrentThreadId() )
return GetThreadContext( ThreadID, ctx );
GetCurrentBacktraceContext( ctx );
return 0;
}
static const char *itoa(unsigned n)
{
static char ret[32];
@@ -293,16 +281,18 @@ void GetExceptionBacktraceContext( BacktraceContext *ctx, const ExceptionInforma
ctx->FramePtr = (void *) exception->registerImage->R1.lo;
}
void GetCurrentBacktraceContext( BacktraceContext *ctx )
{
ctx->FramePtr = __builtin_return_address(2);
}
void InitializeBacktrace() { }
void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx )
{
Frame *frame = (Frame *) ctx->FramePtr;
BacktraceContext CurrentCtx;
if( ctx == NULL )
{
ctx = &CurrentCtx;
CurrentCtx.FramePtr = (void *) __builtin_frame_address(0);
}
const Frame *frame = (Frame *) ctx->FramePtr;
unsigned i = 0;
while( frame && i < size-1 ) // -1 for NULL
+2 -3
View File
@@ -28,9 +28,8 @@ void InitializeBacktrace();
void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx = NULL );
/* Set up a BacktraceContext to get a backtrace for a thread. ThreadID may
* be the current thread. */
int GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx );
void GetCurrentBacktraceContext( BacktraceContext *ctx );
* not be the current thread. */
bool GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx );
/* Set up a BacktraceContext to get a backtrace after receiving a signal, given
* a ucontext_t (see sigaction(2)). (This interface is UNIX-specific.) */
@@ -292,7 +292,10 @@ static void RunCrashHandler( const CrashData *crash )
/* Do this early, so functions called below don't end up on the backtrace. */
const void *BacktracePointers[BACKTRACE_MAX_SIZE];
GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, &crash->ctx );
if( crash->type == CrashData::FORCE_CRASH_THIS_THREAD )
GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, NULL );
else
GetBacktrace( BacktracePointers, BACKTRACE_MAX_SIZE, &crash->ctx );
/* We need to be very careful, since we're under crash conditions. Let's fork
* a process and exec ourself to get a clean environment to work in. */
@@ -333,7 +336,6 @@ void ForceCrashHandler( const char *reason )
strncpy( crash.reason, reason, sizeof(crash.reason) );
crash.reason[ sizeof(crash.reason)-1 ] = 0;
GetCurrentBacktraceContext( &crash.ctx );
RunCrashHandler( &crash );
}
@@ -22,6 +22,7 @@ struct CrashData
// FORCE_CRASH_DEADLOCK
} type;
/* Everything except FORCE_CRASH_THIS_THREAD: */
BacktraceContext ctx;
/* FORCE_CRASH_DEADLOCK only: */
@@ -147,14 +147,14 @@ int ResumeThread( int ThreadID )
}
/* Get user_regs_struct for a thread. tid must not be the current thread.
/* Get a BacktraceContext for a thread. ThreadID must not be the current thread.
*
* tid() is a PID (from getpid) or a TID (from gettid). Note that this may have kernel compatibility
* problems, because NPTL is new and its interactions with ptrace() aren't well-defined.
* If we're on a non-NPTL system, tid is a regular PID. */
int GetThreadContext( int ThreadID, BacktraceContext *ctx )
bool GetThreadBacktraceContext( int ThreadID, BacktraceContext *ctx )
{
/* Can't GetThreadContext the current thread. */
/* Can't GetThreadBacktraceContext the current thread. */
ASSERT( ThreadID != GetCurrentThreadId() );
/* Attach to the thread. */
@@ -187,7 +187,7 @@ int GetThreadContext( int ThreadID, BacktraceContext *ctx )
ASSERT( ret == 0 );
}
ctx->pid = ThreadID;
ctx->eip = regs.eip;
ctx->esp = regs.esp;
ctx->ebp = regs.ebp;