mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 23:20:54 +00:00
libsysprof-analyze: try to load .build-id debug paths
If we have a build-id, we might find it in a path like the following: /usr/lib/debug/.build-id/aa/aa123456789012345678901234567890 so do that lookup before we try to resolve the debuglink name.
This commit is contained in:
@ -262,6 +262,33 @@ get_deepest_debuglink (SysprofElf *elf)
|
|||||||
return debug_link ? get_deepest_debuglink (debug_link) : elf;
|
return debug_link ? get_deepest_debuglink (debug_link) : elf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
try_load_build_id (SysprofElfLoader *self,
|
||||||
|
SysprofMountNamespace *mount_namespace,
|
||||||
|
SysprofElf *elf,
|
||||||
|
const char *build_id,
|
||||||
|
const char *debug_dir)
|
||||||
|
{
|
||||||
|
g_assert (SYSPROF_IS_ELF_LOADER (self));
|
||||||
|
g_assert (!mount_namespace || SYSPROF_IS_MOUNT_NAMESPACE (mount_namespace));
|
||||||
|
g_assert (SYSPROF_IS_ELF (elf));
|
||||||
|
|
||||||
|
if (build_id && build_id[0] && build_id[1])
|
||||||
|
{
|
||||||
|
char prefix[3] = {build_id[0], build_id[1], 0};
|
||||||
|
g_autofree char *build_id_path = g_build_filename (debug_dir, ".build-id", prefix, build_id, NULL);
|
||||||
|
g_autoptr(SysprofElf) debug_link_elf = sysprof_elf_loader_load (self, mount_namespace, build_id_path, build_id, 0, NULL);
|
||||||
|
|
||||||
|
if (debug_link_elf != NULL)
|
||||||
|
{
|
||||||
|
sysprof_elf_set_debug_link_elf (elf, debug_link_elf);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sysprof_elf_loader_annotate (SysprofElfLoader *self,
|
sysprof_elf_loader_annotate (SysprofElfLoader *self,
|
||||||
SysprofMountNamespace *mount_namespace,
|
SysprofMountNamespace *mount_namespace,
|
||||||
@ -289,6 +316,9 @@ sysprof_elf_loader_annotate (SysprofElfLoader *self,
|
|||||||
debug_path = g_build_filename (debug_dir, directory_name, debug_link, NULL);
|
debug_path = g_build_filename (debug_dir, directory_name, debug_link, NULL);
|
||||||
build_id = sysprof_elf_get_build_id (elf);
|
build_id = sysprof_elf_get_build_id (elf);
|
||||||
|
|
||||||
|
if (try_load_build_id (self, mount_namespace, elf, build_id, debug_dir))
|
||||||
|
return;
|
||||||
|
|
||||||
if ((debug_link_elf = sysprof_elf_loader_load (self, mount_namespace, debug_path, build_id, 0, NULL)))
|
if ((debug_link_elf = sysprof_elf_loader_load (self, mount_namespace, debug_path, build_id, 0, NULL)))
|
||||||
{
|
{
|
||||||
sysprof_elf_set_debug_link_elf (elf, get_deepest_debuglink (debug_link_elf));
|
sysprof_elf_set_debug_link_elf (elf, get_deepest_debuglink (debug_link_elf));
|
||||||
@ -312,6 +342,9 @@ sysprof_elf_loader_annotate (SysprofElfLoader *self,
|
|||||||
debug_path = g_build_filename (debug_dir, directory_name, debug_link, NULL);
|
debug_path = g_build_filename (debug_dir, directory_name, debug_link, NULL);
|
||||||
build_id = sysprof_elf_get_build_id (elf);
|
build_id = sysprof_elf_get_build_id (elf);
|
||||||
|
|
||||||
|
if (try_load_build_id (self, NULL, elf, build_id, debug_dir))
|
||||||
|
return;
|
||||||
|
|
||||||
if ((debug_link_elf = sysprof_elf_loader_load (self, NULL, debug_path, build_id, 0, NULL)))
|
if ((debug_link_elf = sysprof_elf_loader_load (self, NULL, debug_path, build_id, 0, NULL)))
|
||||||
{
|
{
|
||||||
sysprof_elf_set_debug_link_elf (elf, get_deepest_debuglink (debug_link_elf));
|
sysprof_elf_set_debug_link_elf (elf, get_deepest_debuglink (debug_link_elf));
|
||||||
|
|||||||
Reference in New Issue
Block a user