From 066b3011bbc5fb4eaa308558696baf99c68e41e2 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Fri, 2 Aug 2019 19:39:20 -0700 Subject: [PATCH] tests: add helper to test symbol resolving --- src/tests/meson.build | 6 +++ src/tests/test-resolvers.c | 101 +++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/tests/test-resolvers.c diff --git a/src/tests/meson.build b/src/tests/meson.build index ac809975..e504e39a 100644 --- a/src/tests/meson.build +++ b/src/tests/meson.build @@ -57,6 +57,12 @@ test_flatpak = executable('test-flatpak', dependencies: test_deps, ) +test_resolvers = executable('test-resolvers', + [ 'test-resolvers.c' ], + c_args: test_cflags, + dependencies: test_deps, +) + if get_option('enable_gtk') diff --git a/src/tests/test-resolvers.c b/src/tests/test-resolvers.c new file mode 100644 index 00000000..f446476f --- /dev/null +++ b/src/tests/test-resolvers.c @@ -0,0 +1,101 @@ +#include + +static const SysprofCaptureSample * +read_to_next_sample (SysprofCaptureReader *reader) +{ + SysprofCaptureFrameType type; + + while (sysprof_capture_reader_peek_type (reader, &type)) + { + if (type != SYSPROF_CAPTURE_FRAME_SAMPLE) + { + if (!sysprof_capture_reader_skip (reader)) + break; + continue; + } + + return sysprof_capture_reader_read_sample (reader); + } + + return NULL; +} + +gint +main (gint argc, + gchar *argv[]) +{ + g_autoptr(GPtrArray) resolvers = NULL; + g_autoptr(SysprofCaptureReader) reader = NULL; + g_autoptr(GError) error = NULL; + const SysprofCaptureSample *sample; + const gchar *filename; + + if (argc != 2) + { + g_printerr ("usage: %s capture_file\n", argv[0]); + return 1; + } + + filename = argv[1]; + resolvers = g_ptr_array_new_with_free_func (g_object_unref); + g_ptr_array_add (resolvers, sysprof_elf_symbol_resolver_new ()); + g_ptr_array_add (resolvers, sysprof_kernel_symbol_resolver_new ()); + + if (!(reader = sysprof_capture_reader_new (filename, &error))) + g_error ("%s", error->message); + + for (guint r = 0; r < resolvers->len; r++) + { + SysprofSymbolResolver *resolver = g_ptr_array_index (resolvers, r); + + sysprof_symbol_resolver_load (resolver, reader); + sysprof_capture_reader_reset (reader); + } + + while ((sample = read_to_next_sample (reader))) + { + SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE; + + g_print ("Sample: pid=%d depth=%d\n", sample->frame.pid, sample->n_addrs); + + for (guint a = 0; a < sample->n_addrs; a++) + { + SysprofAddress addr = sample->addrs[a]; + SysprofAddressContext context; + gboolean found; + + if (sysprof_address_is_context_switch (addr, &context)) + { + g_print (" %02d: %016lx: Context Switch\n", a, addr); + last_context = context; + continue; + } + + for (guint r = 0; r < resolvers->len; r++) + { + SysprofSymbolResolver *resolver = g_ptr_array_index (resolvers, r); + g_autofree gchar *symbol = NULL; + GQuark tag; + + symbol = sysprof_symbol_resolver_resolve_with_context (resolver, + sample->frame.time, + sample->frame.pid, + last_context, + addr, + &tag); + + if (symbol != NULL) + { + g_print (" %02d: %016lx: %s\n", a, addr, symbol); + found = TRUE; + break; + } + } + + if (!found) + g_print (" %02d: %016lx: \n", a, addr); + } + } + + return 0; +}