mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-analyze: add support for external debug dirs
The ELF loader can use a set of external debug dirs which will be used to resolve .gnu_debuglink symbols.
This commit is contained in:
@ -296,6 +296,29 @@ sysprof_elf_loader_annotate (SysprofElfLoader *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (self->external_debug_dirs != NULL)
|
||||||
|
{
|
||||||
|
for (guint i = 0; self->external_debug_dirs[i]; i++)
|
||||||
|
{
|
||||||
|
g_autoptr(SysprofElf) debug_link_elf = NULL;
|
||||||
|
g_autofree char *directory_name = NULL;
|
||||||
|
g_autofree char *debug_path = NULL;
|
||||||
|
g_autofree char *container_path = NULL;
|
||||||
|
const char *debug_dir = self->external_debug_dirs[i];
|
||||||
|
const char *build_id;
|
||||||
|
|
||||||
|
directory_name = g_path_get_dirname (orig_file);
|
||||||
|
debug_path = g_build_filename (debug_dir, directory_name, debug_link, NULL);
|
||||||
|
build_id = sysprof_elf_get_build_id (elf);
|
||||||
|
|
||||||
|
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));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -352,16 +375,26 @@ sysprof_elf_loader_load (SysprofElfLoader *self,
|
|||||||
guint64 file_inode,
|
guint64 file_inode,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
const char * const fallback_paths[2] = { file, NULL };
|
||||||
g_auto(GStrv) paths = NULL;
|
g_auto(GStrv) paths = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_ELF_LOADER (self), NULL);
|
g_return_val_if_fail (SYSPROF_IS_ELF_LOADER (self), NULL);
|
||||||
g_return_val_if_fail (SYSPROF_IS_MOUNT_NAMESPACE (mount_namespace), NULL);
|
g_return_val_if_fail (!mount_namespace || SYSPROF_IS_MOUNT_NAMESPACE (mount_namespace), NULL);
|
||||||
|
|
||||||
/* We must translate the file into a number of paths that may possibly
|
/* We must translate the file into a number of paths that may possibly
|
||||||
* locate the file in the case that there are overlays in the mount
|
* locate the file in the case that there are overlays in the mount
|
||||||
* namespace. Each of the paths could be in a lower overlay layer.
|
* namespace. Each of the paths could be in a lower overlay layer.
|
||||||
|
*
|
||||||
|
* To allow for zero-translation, we allow a NULL mount namespace.
|
||||||
|
* sysprof_elf_loader_annotate() will use that to load from external
|
||||||
|
* directories for which on additional translation is necessary.
|
||||||
*/
|
*/
|
||||||
if (!(paths = sysprof_mount_namespace_translate (mount_namespace, file)))
|
if (mount_namespace == NULL)
|
||||||
|
paths = g_strdupv ((char **)fallback_paths);
|
||||||
|
else
|
||||||
|
paths = sysprof_mount_namespace_translate (mount_namespace, file);
|
||||||
|
|
||||||
|
if (paths == NULL)
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
for (guint i = 0; paths[i]; i++)
|
for (guint i = 0; paths[i]; i++)
|
||||||
@ -407,7 +440,7 @@ sysprof_elf_loader_load (SysprofElfLoader *self,
|
|||||||
|
|
||||||
if (elf != NULL)
|
if (elf != NULL)
|
||||||
{
|
{
|
||||||
if ((debug_link = sysprof_elf_get_debug_link (elf)))
|
if (mount_namespace && (debug_link = sysprof_elf_get_debug_link (elf)))
|
||||||
sysprof_elf_loader_annotate (self, mount_namespace, file, elf, debug_link);
|
sysprof_elf_loader_annotate (self, mount_namespace, file, elf, debug_link);
|
||||||
|
|
||||||
/* If we loaded the ELF, but it doesn't match what this request is looking
|
/* If we loaded the ELF, but it doesn't match what this request is looking
|
||||||
|
|||||||
Reference in New Issue
Block a user