From f01298ead5b17292b5ad0921629fa6e5dce347c6 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 26 Feb 2020 10:24:40 -0800 Subject: [PATCH] libsysprof: allow disabling the kernel symbol resolver The kernel symbol resolver requires access to sysprofd, which might not be available in some contexts (such as when no polkit agent is available). This allows that to continue working by disabling the kernel with the user-only setting. --- src/libsysprof/sysprof-symbols-source.c | 31 +++++++++++++++++++++---- src/libsysprof/sysprof-symbols-source.h | 7 +++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/libsysprof/sysprof-symbols-source.c b/src/libsysprof/sysprof-symbols-source.c index ed6d06f3..b4d7d49a 100644 --- a/src/libsysprof/sysprof-symbols-source.c +++ b/src/libsysprof/sysprof-symbols-source.c @@ -33,6 +33,7 @@ struct _SysprofSymbolsSource { GObject parent_instance; SysprofCaptureWriter *writer; + guint user_only : 1; }; static void source_iface_init (SysprofSourceInterface *iface); @@ -93,12 +94,17 @@ sysprof_symbols_source_supplement (SysprofSource *source, if (-1 == (fd = sysprof_memfd_create ("[sysprof-decode]"))) return; - kernel = sysprof_kernel_symbol_resolver_new (); - native = sysprof_elf_symbol_resolver_new (); - map = sysprof_symbol_map_new (); - sysprof_symbol_map_add_resolver (map, kernel); + + native = sysprof_elf_symbol_resolver_new (); sysprof_symbol_map_add_resolver (map, native); + + if (!self->user_only) + { + kernel = sysprof_kernel_symbol_resolver_new (); + sysprof_symbol_map_add_resolver (map, kernel); + } + sysprof_symbol_map_resolve (map, reader); sysprof_symbol_map_serialize (map, fd); sysprof_symbol_map_free (map); @@ -143,3 +149,20 @@ sysprof_symbols_source_new (void) { return g_object_new (SYSPROF_TYPE_SYMBOLS_SOURCE, NULL); } + +void +sysprof_symbols_source_set_user_only (SysprofSymbolsSource *self, + gboolean user_only) +{ + g_return_if_fail (SYSPROF_IS_SYMBOLS_SOURCE (self)); + + self->user_only = !!user_only; +} + +gboolean +sysprof_symbols_source_get_user_only (SysprofSymbolsSource *self) +{ + g_return_val_if_fail (SYSPROF_IS_SYMBOLS_SOURCE (self), FALSE); + + return self->user_only; +} diff --git a/src/libsysprof/sysprof-symbols-source.h b/src/libsysprof/sysprof-symbols-source.h index 22359f94..c78bb3c1 100644 --- a/src/libsysprof/sysprof-symbols-source.h +++ b/src/libsysprof/sysprof-symbols-source.h @@ -30,6 +30,11 @@ SYSPROF_AVAILABLE_IN_ALL G_DECLARE_FINAL_TYPE (SysprofSymbolsSource, sysprof_symbols_source, SYSPROF, SYMBOLS_SOURCE, GObject) SYSPROF_AVAILABLE_IN_ALL -SysprofSource *sysprof_symbols_source_new (void); +SysprofSource *sysprof_symbols_source_new (void); +SYSPROF_AVAILABLE_IN_3_36 +void sysprof_symbols_source_set_user_only (SysprofSymbolsSource *self, + gboolean user_only); +SYSPROF_AVAILABLE_IN_3_36 +gboolean sysprof_symbols_source_get_user_only (SysprofSymbolsSource *self); G_END_DECLS