mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-29 16:54:35 +00:00
Add support for libbacktrace to detect new elfs have been dynamically loaded after backtrace_initialize() has been called, and consider them for symbol resolution
This commit is contained in:
parent
55f53b9979
commit
b835d73590
@ -86,6 +86,7 @@ set_option(TRACY_NO_CRASH_HANDLER "Disable crash handling" OFF)
|
|||||||
set_option(TRACY_TIMER_FALLBACK "Use lower resolution timers" OFF)
|
set_option(TRACY_TIMER_FALLBACK "Use lower resolution timers" OFF)
|
||||||
set_option(TRACE_CLIENT_LIBUNWIND_BACKTRACE "Use libunwind backtracing where supported" OFF)
|
set_option(TRACE_CLIENT_LIBUNWIND_BACKTRACE "Use libunwind backtracing where supported" OFF)
|
||||||
set_option(TRACY_SYMBOL_OFFLINE_RESOLVE "Instead of full runtime symbol resolution, only resolve the image path and offset to enable offline symbol resolution" OFF)
|
set_option(TRACY_SYMBOL_OFFLINE_RESOLVE "Instead of full runtime symbol resolution, only resolve the image path and offset to enable offline symbol resolution" OFF)
|
||||||
|
set_option(TRACY_LIBBACKTRACE_ELF_DYNLOAD_SUPPORT "Enable libbacktrace to support dynamically loaded elfs in symbol resolution resolution after the first symbol resolve operation" OFF)
|
||||||
|
|
||||||
if(NOT TRACY_STATIC)
|
if(NOT TRACY_STATIC)
|
||||||
target_compile_definitions(TracyClient PRIVATE TRACY_EXPORTS)
|
target_compile_definitions(TracyClient PRIVATE TRACY_EXPORTS)
|
||||||
|
@ -4251,6 +4251,19 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool dwarf_fileline_dwarf_lookup_pc_in_all_entries(struct backtrace_state *state, uintptr_t pc,
|
||||||
|
backtrace_full_callback callback, backtrace_error_callback error_callback, void *data,
|
||||||
|
int& found, int ret)
|
||||||
|
{
|
||||||
|
for (struct dwarf_data* ddata = (struct dwarf_data *)state->fileline_data;
|
||||||
|
ddata != NULL;
|
||||||
|
ddata = ddata->next)
|
||||||
|
{
|
||||||
|
ret = dwarf_lookup_pc(state, ddata, pc, callback, error_callback, data, &found);
|
||||||
|
if (ret != 0 || found) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the file/line information for a PC using the DWARF mapping
|
/* Return the file/line information for a PC using the DWARF mapping
|
||||||
we built earlier. */
|
we built earlier. */
|
||||||
@ -4265,17 +4278,27 @@ dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!state->threaded)
|
if (!state->threaded)
|
||||||
|
{
|
||||||
|
if (dwarf_fileline_dwarf_lookup_pc_in_all_entries(state, pc, callback, error_callback, data, found, ret))
|
||||||
{
|
{
|
||||||
for (ddata = (struct dwarf_data *) state->fileline_data;
|
return ret;
|
||||||
ddata != NULL;
|
|
||||||
ddata = ddata->next)
|
|
||||||
{
|
|
||||||
ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
|
|
||||||
data, &found);
|
|
||||||
if (ret != 0 || found)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we failed to obtain an entry in range, it can mean that the address map has been cahnges and new entries
|
||||||
|
// have been loaded in the meantime. Request a refresh and try again
|
||||||
|
if (state->request_known_address_ranges_refresh_fn)
|
||||||
|
{
|
||||||
|
int new_range_count = state->request_known_address_ranges_refresh_fn(state, pc);
|
||||||
|
if (new_range_count > 0)
|
||||||
|
{
|
||||||
|
if (dwarf_fileline_dwarf_lookup_pc_in_all_entries(state, pc, callback, error_callback, data, found, ret))
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct dwarf_data **pp;
|
struct dwarf_data **pp;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -133,6 +133,11 @@ typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
|
|||||||
backtrace_syminfo_callback callback,
|
backtrace_syminfo_callback callback,
|
||||||
backtrace_error_callback error_callback, void *data);
|
backtrace_error_callback error_callback, void *data);
|
||||||
|
|
||||||
|
/* The type of the function that will trigger an known address range refresh
|
||||||
|
(if pc passed in is for an address whichs lies ourtisde of known ranges) */
|
||||||
|
typedef int (*request_known_address_ranges_refresh)(struct backtrace_state *state,
|
||||||
|
uintptr_t pc);
|
||||||
|
|
||||||
/* What the backtrace state pointer points to. */
|
/* What the backtrace state pointer points to. */
|
||||||
|
|
||||||
struct backtrace_state
|
struct backtrace_state
|
||||||
@ -159,6 +164,8 @@ struct backtrace_state
|
|||||||
int lock_alloc;
|
int lock_alloc;
|
||||||
/* The freelist when using mmap. */
|
/* The freelist when using mmap. */
|
||||||
struct backtrace_freelist_struct *freelist;
|
struct backtrace_freelist_struct *freelist;
|
||||||
|
/* Trigger an known address range refresh */
|
||||||
|
request_known_address_ranges_refresh request_known_address_ranges_refresh_fn;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Open a file for reading. Returns -1 on error. If DOES_NOT_EXIST
|
/* Open a file for reading. Returns -1 on error. If DOES_NOT_EXIST
|
||||||
|
Loading…
Reference in New Issue
Block a user