[sysprof] podman: add debug directories from podman containers



commit 9a3a95a5caff2d558bba9262cf7405dca9602f29
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jan 24 10:54:32 2020 -0800

    podman: add debug directories from podman containers
    
    This is meant to allow us to find the debug files for a given library for
    podman containers running as the current user. However, we still need to
    try to translate the fuse-overlayfs paths when parsing the /proc/pid/mounts
    or we'll have incorrect paths coming from the event stream.

 src/libsysprof/meson.build                   |  1 +
 src/libsysprof/sysprof-elf-symbol-resolver.c |  9 ++++
 src/libsysprof/sysprof-podman.c              | 65 ++++++++++++++++++++++++++++
 src/libsysprof/sysprof-podman.h              | 29 +++++++++++++
 4 files changed, 104 insertions(+)
---
diff --git a/src/libsysprof/meson.build b/src/libsysprof/meson.build
index 77c76c7..2b40744 100644
--- a/src/libsysprof/meson.build
+++ b/src/libsysprof/meson.build
@@ -69,6 +69,7 @@ libsysprof_private_sources = [
   'sysprof-line-reader.c',
   'sysprof-map-lookaside.c',
   'sysprof-mountinfo.c',
+  'sysprof-podman.c',
   'sysprof-polkit.c',
   'sysprof-symbol-map.c',
   ipc_service_src,
diff --git a/src/libsysprof/sysprof-elf-symbol-resolver.c b/src/libsysprof/sysprof-elf-symbol-resolver.c
index 10b9716..5dec9ec 100644
--- a/src/libsysprof/sysprof-elf-symbol-resolver.c
+++ b/src/libsysprof/sysprof-elf-symbol-resolver.c
@@ -27,6 +27,7 @@
 #include "sysprof-elf-symbol-resolver.h"
 #include "sysprof-flatpak.h"
 #include "sysprof-map-lookaside.h"
+#include "sysprof-podman.h"
 
 struct _SysprofElfSymbolResolver
 {
@@ -92,12 +93,20 @@ free_element_string (gpointer data)
 static void
 sysprof_elf_symbol_resolver_init (SysprofElfSymbolResolver *self)
 {
+  g_auto(GStrv) podman_dirs = NULL;
+
   self->debug_dirs = g_array_new (TRUE, FALSE, sizeof (gchar *));
   g_array_set_clear_func (self->debug_dirs, free_element_string);
+
   sysprof_elf_symbol_resolver_add_debug_dir (self, "/usr/lib/debug");
   sysprof_elf_symbol_resolver_add_debug_dir (self, "/usr/lib32/debug");
   sysprof_elf_symbol_resolver_add_debug_dir (self, "/usr/lib64/debug");
 
+  /* The user may have podman/toolbox containers */
+  podman_dirs = sysprof_podman_debug_dirs ();
+  for (guint i = 0; podman_dirs[i]; i++)
+    sysprof_elf_symbol_resolver_add_debug_dir (self, podman_dirs[i]);
+
   if (is_flatpak ())
     {
       g_auto(GStrv) debug_dirs = sysprof_flatpak_debug_dirs ();
diff --git a/src/libsysprof/sysprof-podman.c b/src/libsysprof/sysprof-podman.c
new file mode 100644
index 0000000..3d2a51b
--- /dev/null
+++ b/src/libsysprof/sysprof-podman.c
@@ -0,0 +1,65 @@
+/* sysprof-podman.c
+ *
+ * Copyright 2019 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "sysprof-podman"
+
+#include "config.h"
+
+#include "sysprof-podman.h"
+
+void
+_sysprof_podman_debug_dirs (GPtrArray *dirs)
+{
+  g_autofree gchar *base_path = NULL;
+  g_autoptr(GDir) dir = NULL;
+  const gchar *name;
+
+  g_assert (dirs != NULL);
+
+  base_path = g_build_filename (g_get_user_data_dir (),
+                                "containres",
+                                "storage",
+                                "overlay",
+                                NULL);
+
+  if (!(dir = g_dir_open (base_path, 0, NULL)))
+    return;
+
+  while ((name = g_dir_read_name (dir)))
+    {
+      g_autofree gchar *debug_path = NULL;
+
+      debug_path = g_build_filename (base_path, name, "diff",
+                                     "usr", "lib", "debug",
+                                     NULL);
+
+      if (g_file_test (debug_path, G_FILE_TEST_IS_DIR))
+        g_ptr_array_add (dirs, g_steal_pointer (&debug_path));
+    }
+}
+
+gchar **
+sysprof_podman_debug_dirs (void)
+{
+  GPtrArray *dirs = g_ptr_array_new ();
+  _sysprof_podman_debug_dirs (dirs);
+  g_ptr_array_add (dirs, NULL);
+  return (gchar **)g_ptr_array_free (dirs, FALSE);
+}
diff --git a/src/libsysprof/sysprof-podman.h b/src/libsysprof/sysprof-podman.h
new file mode 100644
index 0000000..b113f6f
--- /dev/null
+++ b/src/libsysprof/sysprof-podman.h
@@ -0,0 +1,29 @@
+/* sysprof-podman.h
+ *
+ * Copyright 2020 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+gchar **sysprof_podman_debug_dirs (void);
+
+G_END_DECLS


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