diff --git a/client/TracyCallstack.cpp b/client/TracyCallstack.cpp index c6663dfa..0b7415c5 100644 --- a/client/TracyCallstack.cpp +++ b/client/TracyCallstack.cpp @@ -401,7 +401,7 @@ void InitCallstack() cb_bts = backtrace_create_state( nullptr, 0, nullptr, nullptr ); } -static int FastCallstackDataCb( void* data, uintptr_t pc, const char* fn, int lineno, const char* function ) +static int FastCallstackDataCb( void* data, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function ) { if( function ) { @@ -440,7 +440,7 @@ const char* DecodeCallstackPtrFast( uint64_t ptr ) return ret; } -static int SymbolAddressDataCb( void* data, uintptr_t pc, const char* fn, int lineno, const char* function ) +static int SymbolAddressDataCb( void* data, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function ) { auto& sym = *(SymbolData*)data; if( !fn ) @@ -480,13 +480,13 @@ SymbolData DecodeCodeAddress( uint64_t ptr ) return DecodeSymbolAddress( ptr ); } -static int CallstackDataCb( void* /*data*/, uintptr_t pc, const char* fn, int lineno, const char* function ) +static int CallstackDataCb( void* /*data*/, uintptr_t pc, uintptr_t lowaddr, const char* fn, int lineno, const char* function ) { enum { DemangleBufLen = 64*1024 }; char demangled[DemangleBufLen]; cb_data[cb_num].symLen = 0; - cb_data[cb_num].symAddr = (uint64_t)pc; + cb_data[cb_num].symAddr = (uint64_t)lowaddr; if( !fn && !function ) { @@ -597,14 +597,14 @@ static void CallstackErrorCb( void* /*data*/, const char* /*msg*/, int /*errnum* void SymInfoCallback( void* /*data*/, uintptr_t pc, const char* symname, uintptr_t symval, uintptr_t symsize ) { - cb_data[cb_fixup].symLen = (uint32_t)symsize; - cb_data[cb_fixup].symAddr = (uint64_t)symval; + cb_data[cb_num-1].symLen = (uint32_t)symsize; + cb_data[cb_num-1].symAddr = (uint64_t)symval; } void SymInfoError( void* /*data*/, const char* /*msg*/, int /*errnum*/ ) { - cb_data[cb_fixup].symLen = 0; - cb_data[cb_fixup].symAddr = 0; + cb_data[cb_num-1].symLen = 0; + cb_data[cb_num-1].symAddr = 0; } CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) @@ -613,11 +613,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) backtrace_pcinfo( cb_bts, ptr, CallstackDataCb, CallstackErrorCb, nullptr ); assert( cb_num > 0 ); - for( int i=0; iname); + ret = callback (data, pc, function_addrs->low, *filename, *lineno, inlined->name); if (ret != 0) return ret; @@ -4026,7 +4026,7 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata, if (new_data) return dwarf_lookup_pc (state, ddata, pc, callback, error_callback, data, found); - return callback (data, pc, NULL, 0, NULL); + return callback (data, pc, 0, NULL, 0, NULL); } /* Search for PC within this unit. */ @@ -4073,13 +4073,13 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata, entry->u->abs_filename = filename; } - return callback (data, pc, entry->u->abs_filename, 0, NULL); + return callback (data, pc, 0, entry->u->abs_filename, 0, NULL); } /* Search for function name within this unit. */ if (entry->u->function_addrs_count == 0) - return callback (data, pc, ln->filename, ln->lineno, NULL); + return callback (data, pc, 0, ln->filename, ln->lineno, NULL); function_addrs = ((struct function_addrs *) bsearch (&pc, entry->u->function_addrs, @@ -4087,7 +4087,7 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata, sizeof (struct function_addrs), function_addrs_search)); if (function_addrs == NULL) - return callback (data, pc, ln->filename, ln->lineno, NULL); + return callback (data, pc, 0, ln->filename, ln->lineno, NULL); /* If there are multiple function ranges that contain PC, use the last one, in order to produce predictable results. */ @@ -4108,7 +4108,7 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata, if (ret != 0) return ret; - return callback (data, pc, filename, lineno, function->name); + return callback (data, pc, function_addrs->low, filename, lineno, function->name); } @@ -4158,7 +4158,7 @@ dwarf_fileline (struct backtrace_state *state, uintptr_t pc, /* FIXME: See if any libraries have been dlopen'ed. */ - return callback (data, pc, NULL, 0, NULL); + return callback (data, pc, 0, NULL, 0, NULL); } /* Initialize our data structures from the DWARF debug info for a