[sysprof] elf: track pid root when building lookaside buffers



commit bd8a8ada2607136a56a75f3aeb761f6f3f9a090c
Author: Christian Hergert <chergert redhat com>
Date:   Wed Feb 24 18:59:35 2021 -0800

    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.

 src/libsysprof/sysprof-elf-symbol-resolver.c | 61 +++++++++++++++++-----------
 src/libsysprof/sysprof-map-lookaside.c       | 16 +++++---
 src/libsysprof/sysprof-map-lookaside.h       | 21 ++++++----
 3 files changed, 62 insertions(+), 36 deletions(-)
---
diff --git a/src/libsysprof/sysprof-elf-symbol-resolver.c b/src/libsysprof/sysprof-elf-symbol-resolver.c
index 2425ed6..c81de6f 100644
--- a/src/libsysprof/sysprof-elf-symbol-resolver.c
+++ b/src/libsysprof/sysprof-elf-symbol-resolver.c
@@ -142,34 +142,49 @@ sysprof_elf_symbol_resolver_load (SysprofSymbolResolver *resolver,
 
   while (sysprof_capture_reader_peek_type (reader, &type))
     {
-      const SysprofCaptureMap *ev;
-      SysprofMapLookaside *lookaside;
-      SysprofMap map;
-
-      if (type != SYSPROF_CAPTURE_FRAME_MAP)
+      if (type == SYSPROF_CAPTURE_FRAME_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;
+
+          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))
             return;
           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);
     }
 }
 
diff --git a/src/libsysprof/sysprof-map-lookaside.c b/src/libsysprof/sysprof-map-lookaside.c
index 277e7f6..9881e4a 100644
--- a/src/libsysprof/sysprof-map-lookaside.c
+++ b/src/libsysprof/sysprof-map-lookaside.c
@@ -24,12 +24,6 @@
 
 #include "sysprof-map-lookaside.h"
 
-struct _SysprofMapLookaside
-{
-  GSequence    *seq;
-  GStringChunk *chunk;
-};
-
 static gint
 sysprof_map_compare (gconstpointer a,
                      gconstpointer b,
@@ -107,6 +101,16 @@ sysprof_map_lookaside_insert (SysprofMapLookaside *self,
   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 *
 sysprof_map_lookaside_lookup (SysprofMapLookaside   *self,
                               SysprofCaptureAddress  address)
diff --git a/src/libsysprof/sysprof-map-lookaside.h b/src/libsysprof/sysprof-map-lookaside.h
index ef06856..b91a03a 100644
--- a/src/libsysprof/sysprof-map-lookaside.h
+++ b/src/libsysprof/sysprof-map-lookaside.h
@@ -26,7 +26,12 @@
 
 G_BEGIN_DECLS
 
-typedef struct _SysprofMapLookaside SysprofMapLookaside;
+typedef struct _SysprofMapLookaside
+{
+  GSequence    *seq;
+  GStringChunk *chunk;
+  const gchar  *root;
+} SysprofMapLookaside;
 
 typedef struct
 {
@@ -37,12 +42,14 @@ typedef struct
   const gchar           *filename;
 } SysprofMap;
 
-SysprofMapLookaside *sysprof_map_lookaside_new    (void);
-void                 sysprof_map_lookaside_insert (SysprofMapLookaside   *self,
-                                                   const SysprofMap      *map);
-const SysprofMap    *sysprof_map_lookaside_lookup (SysprofMapLookaside   *self,
-                                                   SysprofCaptureAddress  address);
-void                 sysprof_map_lookaside_free   (SysprofMapLookaside   *self);
+SysprofMapLookaside *sysprof_map_lookaside_new      (void);
+void                 sysprof_map_lookaside_insert   (SysprofMapLookaside    *self,
+                                                     const SysprofMap       *map);
+void                 sysprof_map_lookaside_set_root (SysprofMapLookaside    *self,
+                                                     const gchar            *root);
+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)
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]