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.
This commit is contained in:
Christian Hergert
2020-02-26 10:24:40 -08:00
parent 14973bc2b9
commit f01298ead5
2 changed files with 33 additions and 5 deletions

View File

@ -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;
}

View File

@ -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