mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof: decode allocation frames into symbol map
This ensures that we have proper symbols when opening a file with allcoation frames.
This commit is contained in:
@ -233,9 +233,62 @@ sysprof_symbol_map_add_resolver (SysprofSymbolMap *self,
|
||||
}
|
||||
|
||||
static void
|
||||
sysprof_symbol_map_do_sample (SysprofSymbolMap *self,
|
||||
SysprofCaptureReader *reader,
|
||||
GHashTable *seen)
|
||||
sysprof_symbol_map_do_alloc (SysprofSymbolMap *self,
|
||||
SysprofCaptureReader *reader,
|
||||
GHashTable *seen)
|
||||
{
|
||||
const SysprofCaptureAllocation *ev;
|
||||
|
||||
g_assert (self != NULL);
|
||||
g_assert (reader != NULL);
|
||||
g_assert (seen != NULL);
|
||||
|
||||
if (!(ev = sysprof_capture_reader_read_allocation (reader)))
|
||||
return;
|
||||
|
||||
for (guint i = 0; i < ev->n_addrs; i++)
|
||||
{
|
||||
SysprofCaptureAddress addr = ev->addrs[i];
|
||||
|
||||
for (guint j = 0; j < self->resolvers->len; j++)
|
||||
{
|
||||
SysprofSymbolResolver *resolver = g_ptr_array_index (self->resolvers, j);
|
||||
g_autofree gchar *name = NULL;
|
||||
const gchar *cname;
|
||||
Element ele;
|
||||
GQuark tag = 0;
|
||||
|
||||
name = sysprof_symbol_resolver_resolve_with_context (resolver,
|
||||
ev->frame.time,
|
||||
ev->frame.pid,
|
||||
SYSPROF_ADDRESS_CONTEXT_USER,
|
||||
addr,
|
||||
&tag);
|
||||
|
||||
if (name == NULL)
|
||||
continue;
|
||||
|
||||
cname = g_string_chunk_insert_const (self->chunk, name);
|
||||
|
||||
ele.addr = addr;
|
||||
ele.pid = ev->frame.pid;
|
||||
ele.name = cname;
|
||||
ele.tag = tag;
|
||||
|
||||
if (!g_hash_table_contains (seen, &ele))
|
||||
{
|
||||
Element *cpy = g_slice_dup (Element, &ele);
|
||||
g_hash_table_add (seen, cpy);
|
||||
g_ptr_array_add (self->samples, cpy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sysprof_symbol_map_do_sample (SysprofSymbolMap *self,
|
||||
SysprofCaptureReader *reader,
|
||||
GHashTable *seen)
|
||||
{
|
||||
SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE;
|
||||
const SysprofCaptureSample *sample;
|
||||
@ -323,6 +376,11 @@ sysprof_symbol_map_resolve (SysprofSymbolMap *self,
|
||||
sysprof_symbol_map_do_sample (self, reader, seen);
|
||||
continue;
|
||||
}
|
||||
else if (type == SYSPROF_CAPTURE_FRAME_ALLOCATION)
|
||||
{
|
||||
sysprof_symbol_map_do_alloc (self, reader, seen);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sysprof_capture_reader_skip (reader))
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user