1
0
mirror of https://github.com/wolfpld/tracy.git synced 2025-03-20 07:40:02 +08:00

Android callstack collection using _Unwind_Backtrace().

This commit is contained in:
Bartosz Taudul
2018-06-21 17:07:21 +02:00
parent 0c13fb818b
commit bf7402e8b0
2 changed files with 117 additions and 0 deletions
+38
View File
@@ -10,6 +10,9 @@ extern "C" __declspec(dllimport) unsigned short __stdcall RtlCaptureStackBackTra
extern "C" __declspec(dllimport) unsigned short __stdcall RtlCaptureStackBackTrace( unsigned long, unsigned long, void**, unsigned long* );
# endif
# endif
#elif defined __ANDROID__
# define TRACY_HAS_CALLSTACK
# include <unwind.h>
#elif defined _GNU_SOURCE
# define TRACY_HAS_CALLSTACK
# include <execinfo.h>
@@ -52,6 +55,41 @@ static tracy_force_inline void* Callstack( int depth )
return trace;
}
#elif defined __ANDROID__
static tracy_force_inline void InitCallstack() {}
struct BacktraceState
{
void** current;
void** end;
};
static _Unwind_Reason_Code tracy_unwind_callback( struct _Unwind_Context* ctx, void* arg )
{
auto state = (BacktraceState*)arg;
uintptr_t pc = _Unwind_GetIP( ctx );
if( pc )
{
if( state->current == state->end ) return _URC_END_OF_STACK;
*state->current++ = (void*)pc;
}
return _URC_NO_REASON;
}
static tracy_force_inline void* Callstack( int depth )
{
assert( depth >= 1 && depth < 63 );
auto trace = (uintptr_t*)tracy_malloc( ( 1 + depth ) * sizeof( uintptr_t ) );
BacktraceState state = { (void**)(trace+1), (void**)(trace+1+depth) };
_Unwind_Backtrace( tracy_unwind_callback, &state );
*trace = (uintptr_t*)state.current - trace + 1;
return trace;
}
#elif defined _GNU_SOURCE
static tracy_force_inline void InitCallstack() {}