diff --git a/src/tests/meson.build b/src/tests/meson.build index f42aa694..4534f7df 100644 --- a/src/tests/meson.build +++ b/src/tests/meson.build @@ -23,6 +23,11 @@ test_addr_map = executable('test-addr-map', dependencies: test_deps, ) +test_addr_decode = executable('test-addr-decode', 'test-addr-decode.c', + c_args: test_cflags, + dependencies: test_deps, +) + test_capture = executable('test-capture', 'test-capture.c', c_args: test_cflags, dependencies: test_deps, diff --git a/src/tests/test-addr-decode.c b/src/tests/test-addr-decode.c new file mode 100644 index 00000000..2a1ff4cf --- /dev/null +++ b/src/tests/test-addr-decode.c @@ -0,0 +1,78 @@ +#include +#include + +#include "sysprof-platform.h" +#include "sysprof-capture-symbol-resolver.h" + +gint +main (gint argc, + gchar *argv[]) +{ + g_autoptr(SysprofCaptureReader) reader = NULL; + g_autoptr(SysprofSymbolResolver) resolver = NULL; + g_autoptr(GError) error = NULL; + SysprofCaptureFrameType type; + + if (argc != 2) + { + g_printerr ("usage: %s CAPTURE_FILE\n", argv[0]); + return 1; + } + + if (!(reader = sysprof_capture_reader_new (argv[1], &error))) + { + g_printerr ("%s\n", error->message); + return 1; + } + + resolver = sysprof_capture_symbol_resolver_new (); + sysprof_symbol_resolver_load (resolver, reader); + + sysprof_capture_reader_reset (reader); + + while (sysprof_capture_reader_peek_type (reader, &type)) + { + if (type == SYSPROF_CAPTURE_FRAME_SAMPLE) + { + const SysprofCaptureSample *sample; + SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE; + + if ((sample = sysprof_capture_reader_read_sample (reader))) + { + for (guint i = 0; i < sample->n_addrs; i++) + { + g_autofree gchar *name = NULL; + SysprofAddressContext context; + GQuark tag = 0; + + if (sysprof_address_is_context_switch (sample->addrs[i], &context)) + { + last_context = context; + continue; + } + + name = sysprof_symbol_resolver_resolve_with_context (resolver, + sample->frame.time, + sample->frame.pid, + last_context, + sample->addrs[i], + &tag); + + g_print ("%u: %s [%s]\n", + i, + name ? name : "-- missing --", + tag ? g_quark_to_string (tag) : ""); + } + + g_print ("======\n"); + + continue; + } + } + + if (!sysprof_capture_reader_skip (reader)) + break; + } + + return 0; +}