mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-07 21:50:54 +00:00
elf: track pid root when building lookaside buffers
We want to know the location of our root if it was specified in the capture file. Such is useful for decoding symbols that may not be reported right from perf tooling. This allows us to try to translate maps for processes in containers.
This commit is contained in:
@ -142,34 +142,49 @@ sysprof_elf_symbol_resolver_load (SysprofSymbolResolver *resolver,
|
|||||||
|
|
||||||
while (sysprof_capture_reader_peek_type (reader, &type))
|
while (sysprof_capture_reader_peek_type (reader, &type))
|
||||||
{
|
{
|
||||||
const SysprofCaptureMap *ev;
|
if (type == SYSPROF_CAPTURE_FRAME_MAP)
|
||||||
SysprofMapLookaside *lookaside;
|
{
|
||||||
SysprofMap map;
|
const SysprofCaptureMap *ev = sysprof_capture_reader_read_map (reader);
|
||||||
|
SysprofMapLookaside *lookaside = g_hash_table_lookup (self->lookasides, GINT_TO_POINTER (ev->frame.pid));
|
||||||
|
SysprofMap map;
|
||||||
|
|
||||||
if (type != SYSPROF_CAPTURE_FRAME_MAP)
|
map.start = ev->start;
|
||||||
|
map.end = ev->end;
|
||||||
|
map.offset = ev->offset;
|
||||||
|
map.inode = ev->inode;
|
||||||
|
map.filename = ev->filename;
|
||||||
|
|
||||||
|
if (lookaside == NULL)
|
||||||
|
{
|
||||||
|
lookaside = sysprof_map_lookaside_new ();
|
||||||
|
g_hash_table_insert (self->lookasides, GINT_TO_POINTER (ev->frame.pid), lookaside);
|
||||||
|
}
|
||||||
|
|
||||||
|
sysprof_map_lookaside_insert (lookaside, &map);
|
||||||
|
}
|
||||||
|
else if (type == SYSPROF_CAPTURE_FRAME_PID_ROOT)
|
||||||
|
{
|
||||||
|
const SysprofCapturePidRoot *ev = sysprof_capture_reader_read_pid_root (reader);
|
||||||
|
SysprofMapLookaside *lookaside = g_hash_table_lookup (self->lookasides, GINT_TO_POINTER (ev->frame.pid));
|
||||||
|
|
||||||
|
if (lookaside == NULL)
|
||||||
|
{
|
||||||
|
lookaside = sysprof_map_lookaside_new ();
|
||||||
|
g_hash_table_insert (self->lookasides, GINT_TO_POINTER (ev->frame.pid), lookaside);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Someday we might need to support more layers, but currently
|
||||||
|
* only the base layer (0) is used.
|
||||||
|
*/
|
||||||
|
if (ev->layer == 0)
|
||||||
|
sysprof_map_lookaside_set_root (lookaside, ev->path);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (!sysprof_capture_reader_skip (reader))
|
if (!sysprof_capture_reader_skip (reader))
|
||||||
return;
|
return;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ev = sysprof_capture_reader_read_map (reader);
|
|
||||||
|
|
||||||
map.start = ev->start;
|
|
||||||
map.end = ev->end;
|
|
||||||
map.offset = ev->offset;
|
|
||||||
map.inode = ev->inode;
|
|
||||||
map.filename = ev->filename;
|
|
||||||
|
|
||||||
lookaside = g_hash_table_lookup (self->lookasides, GINT_TO_POINTER (ev->frame.pid));
|
|
||||||
|
|
||||||
if (lookaside == NULL)
|
|
||||||
{
|
|
||||||
lookaside = sysprof_map_lookaside_new ();
|
|
||||||
g_hash_table_insert (self->lookasides, GINT_TO_POINTER (ev->frame.pid), lookaside);
|
|
||||||
}
|
|
||||||
|
|
||||||
sysprof_map_lookaside_insert (lookaside, &map);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,12 +24,6 @@
|
|||||||
|
|
||||||
#include "sysprof-map-lookaside.h"
|
#include "sysprof-map-lookaside.h"
|
||||||
|
|
||||||
struct _SysprofMapLookaside
|
|
||||||
{
|
|
||||||
GSequence *seq;
|
|
||||||
GStringChunk *chunk;
|
|
||||||
};
|
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
sysprof_map_compare (gconstpointer a,
|
sysprof_map_compare (gconstpointer a,
|
||||||
gconstpointer b,
|
gconstpointer b,
|
||||||
@ -107,6 +101,16 @@ sysprof_map_lookaside_insert (SysprofMapLookaside *self,
|
|||||||
g_sequence_insert_sorted (self->seq, copy, sysprof_map_compare, NULL);
|
g_sequence_insert_sorted (self->seq, copy, sysprof_map_compare, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sysprof_map_lookaside_set_root (SysprofMapLookaside *self,
|
||||||
|
const char *root)
|
||||||
|
{
|
||||||
|
g_assert (self != NULL);
|
||||||
|
g_assert (root != NULL);
|
||||||
|
|
||||||
|
self->root = g_string_chunk_insert_const (self->chunk, root);
|
||||||
|
}
|
||||||
|
|
||||||
const SysprofMap *
|
const SysprofMap *
|
||||||
sysprof_map_lookaside_lookup (SysprofMapLookaside *self,
|
sysprof_map_lookaside_lookup (SysprofMapLookaside *self,
|
||||||
SysprofCaptureAddress address)
|
SysprofCaptureAddress address)
|
||||||
|
|||||||
@ -26,7 +26,12 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _SysprofMapLookaside SysprofMapLookaside;
|
typedef struct _SysprofMapLookaside
|
||||||
|
{
|
||||||
|
GSequence *seq;
|
||||||
|
GStringChunk *chunk;
|
||||||
|
const gchar *root;
|
||||||
|
} SysprofMapLookaside;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -37,12 +42,14 @@ typedef struct
|
|||||||
const gchar *filename;
|
const gchar *filename;
|
||||||
} SysprofMap;
|
} SysprofMap;
|
||||||
|
|
||||||
SysprofMapLookaside *sysprof_map_lookaside_new (void);
|
SysprofMapLookaside *sysprof_map_lookaside_new (void);
|
||||||
void sysprof_map_lookaside_insert (SysprofMapLookaside *self,
|
void sysprof_map_lookaside_insert (SysprofMapLookaside *self,
|
||||||
const SysprofMap *map);
|
const SysprofMap *map);
|
||||||
const SysprofMap *sysprof_map_lookaside_lookup (SysprofMapLookaside *self,
|
void sysprof_map_lookaside_set_root (SysprofMapLookaside *self,
|
||||||
SysprofCaptureAddress address);
|
const gchar *root);
|
||||||
void sysprof_map_lookaside_free (SysprofMapLookaside *self);
|
const SysprofMap *sysprof_map_lookaside_lookup (SysprofMapLookaside *self,
|
||||||
|
SysprofCaptureAddress address);
|
||||||
|
void sysprof_map_lookaside_free (SysprofMapLookaside *self);
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofMapLookaside, sysprof_map_lookaside_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofMapLookaside, sysprof_map_lookaside_free)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user