libsysprof-analyze: kallsyms constructor with provided file

This allows parsing a kallsyms file that is provided by the application.
Such use could be necessary if a capture did not embed /proc/kallsyms.gz.
This commit is contained in:
Christian Hergert
2023-05-23 11:03:34 -07:00
parent fd69b1051c
commit b2a48fe38d
2 changed files with 55 additions and 15 deletions

View File

@ -39,6 +39,7 @@ typedef struct _KernelSymbol
struct _SysprofKallsymsSymbolizer struct _SysprofKallsymsSymbolizer
{ {
SysprofSymbolizer parent_instance; SysprofSymbolizer parent_instance;
GInputStream *stream;
GArray *kallsyms; GArray *kallsyms;
guint64 low; guint64 low;
guint64 high; guint64 high;
@ -202,6 +203,8 @@ sysprof_kallsyms_symbolizer_prepare_async (SysprofSymbolizer *symbolizer,
task = g_task_new (self, cancellable, callback, user_data); task = g_task_new (self, cancellable, callback, user_data);
g_task_set_source_tag (task, sysprof_kallsyms_symbolizer_prepare_async); g_task_set_source_tag (task, sysprof_kallsyms_symbolizer_prepare_async);
if (self->stream == NULL)
{
if (!(file = sysprof_document_lookup_file (document, "/proc/kallsyms.gz"))) if (!(file = sysprof_document_lookup_file (document, "/proc/kallsyms.gz")))
{ {
g_task_return_new_error (task, g_task_return_new_error (task,
@ -218,6 +221,14 @@ sysprof_kallsyms_symbolizer_prepare_async (SysprofSymbolizer *symbolizer,
g_task_set_task_data (task, g_task_set_task_data (task,
g_data_input_stream_new (input), g_data_input_stream_new (input),
g_object_unref); g_object_unref);
}
else
{
g_task_set_task_data (task,
g_steal_pointer (&self->stream),
g_object_unref);
}
g_task_run_in_thread (task, sysprof_kallsyms_symbolizer_prepare_worker); g_task_run_in_thread (task, sysprof_kallsyms_symbolizer_prepare_worker);
} }
@ -332,3 +343,28 @@ sysprof_kallsyms_symbolizer_new (void)
{ {
return g_object_new (SYSPROF_TYPE_KALLSYMS_SYMBOLIZER, NULL); return g_object_new (SYSPROF_TYPE_KALLSYMS_SYMBOLIZER, NULL);
} }
/**
* sysprof_kallsyms_symbolizer_new_for_symbols:
* @symbols: (transfer full): a #GInputStream
*
* Creates a symbolizer using the contents of @symbols as the contents
* of `/proc/kallsyms` for decoding. This is useful if you need to unwind
* symbols from a machine that is different than where the capture was
* recorded and have not embedded `/proc/kallsyms.gz` within the capture
* file for use by #SysprofKallsymsSymbolizer.
*
* Returns: (transfer full): a #SysprofKallsymsSymbolizer
*/
SysprofSymbolizer *
sysprof_kallsyms_symbolizer_new_for_symbols (GInputStream *symbols)
{
SysprofKallsymsSymbolizer *self;
g_return_val_if_fail (G_IS_INPUT_STREAM (symbols), NULL);
self = g_object_new (SYSPROF_TYPE_KALLSYMS_SYMBOLIZER, NULL);
self->stream = symbols;
return SYSPROF_SYMBOLIZER (self);
}

View File

@ -20,6 +20,8 @@
#pragma once #pragma once
#include <gio/gio.h>
#include "sysprof-symbolizer.h" #include "sysprof-symbolizer.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -36,6 +38,8 @@ SYSPROF_AVAILABLE_IN_ALL
GType sysprof_kallsyms_symbolizer_get_type (void) G_GNUC_CONST; GType sysprof_kallsyms_symbolizer_get_type (void) G_GNUC_CONST;
SYSPROF_AVAILABLE_IN_ALL SYSPROF_AVAILABLE_IN_ALL
SysprofSymbolizer *sysprof_kallsyms_symbolizer_new (void); SysprofSymbolizer *sysprof_kallsyms_symbolizer_new (void);
SYSPROF_AVAILABLE_IN_ALL
SysprofSymbolizer *sysprof_kallsyms_symbolizer_new_for_symbols (GInputStream *symbols);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofKallsymsSymbolizer, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (SysprofKallsymsSymbolizer, g_object_unref)