mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 07:00:53 +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
|
static void
|
||||||
sysprof_symbol_map_do_sample (SysprofSymbolMap *self,
|
sysprof_symbol_map_do_alloc (SysprofSymbolMap *self,
|
||||||
SysprofCaptureReader *reader,
|
SysprofCaptureReader *reader,
|
||||||
GHashTable *seen)
|
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;
|
SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE;
|
||||||
const SysprofCaptureSample *sample;
|
const SysprofCaptureSample *sample;
|
||||||
@ -323,6 +376,11 @@ sysprof_symbol_map_resolve (SysprofSymbolMap *self,
|
|||||||
sysprof_symbol_map_do_sample (self, reader, seen);
|
sysprof_symbol_map_do_sample (self, reader, seen);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (type == SYSPROF_CAPTURE_FRAME_ALLOCATION)
|
||||||
|
{
|
||||||
|
sysprof_symbol_map_do_alloc (self, reader, seen);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!sysprof_capture_reader_skip (reader))
|
if (!sysprof_capture_reader_skip (reader))
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user