Files
sysprof/src/libsysprof/tests/test-capture-model.c
2023-07-27 12:22:31 -07:00

154 lines
6.4 KiB
C

#include <errno.h>
#include <fcntl.h>
#include <sysprof.h>
#include "sysprof-document-private.h"
int
main (int argc,
char *argv[])
{
g_autoptr(SysprofDocumentLoader) loader = NULL;
g_autoptr(SysprofDocument) document = NULL;
g_autoptr(GError) error = NULL;
const char *filename;
guint n_items;
sysprof_clock_init ();
if (argc < 2)
{
g_printerr ("usage: %s FILENAME\n", argv[0]);
return 1;
}
filename = argv[1];
loader = sysprof_document_loader_new (filename);
sysprof_document_loader_set_symbolizer (loader, sysprof_no_symbolizer_get ());
if (!(document = sysprof_document_loader_load (loader, NULL, &error)))
{
g_printerr ("Failed to load %s: %s\n",
filename, error->message);
return 1;
}
n_items = g_list_model_get_n_items (G_LIST_MODEL (document));
for (guint i = 0; i < n_items; i++)
{
SysprofDocumentFrame *frame = g_list_model_get_item (G_LIST_MODEL (document), i);
g_print ("%"G_GINT64_FORMAT" [pid %d] [cpu %d] (type %s)",
sysprof_document_frame_get_time (frame),
sysprof_document_frame_get_pid (frame),
sysprof_document_frame_get_cpu (frame),
G_OBJECT_TYPE_NAME (frame));
if (0) {}
else if (SYSPROF_IS_DOCUMENT_LOG (frame))
g_print (" domain=%s message=%s",
sysprof_document_log_get_domain (SYSPROF_DOCUMENT_LOG (frame)),
sysprof_document_log_get_message (SYSPROF_DOCUMENT_LOG (frame)));
else if (SYSPROF_IS_DOCUMENT_MARK (frame))
g_print (" group=%s name=%s message=%s",
sysprof_document_mark_get_group (SYSPROF_DOCUMENT_MARK (frame)),
sysprof_document_mark_get_name (SYSPROF_DOCUMENT_MARK (frame)),
sysprof_document_mark_get_message (SYSPROF_DOCUMENT_MARK (frame)));
else if (SYSPROF_IS_DOCUMENT_PROCESS (frame))
g_print (" cmdline=%s", sysprof_document_process_get_command_line (SYSPROF_DOCUMENT_PROCESS (frame)));
else if (SYSPROF_IS_DOCUMENT_METADATA (frame))
g_print (" id=%s value=%s",
sysprof_document_metadata_get_id (SYSPROF_DOCUMENT_METADATA (frame)),
sysprof_document_metadata_get_value (SYSPROF_DOCUMENT_METADATA (frame)));
else if (SYSPROF_IS_DOCUMENT_FILE_CHUNK (frame))
g_print (" file-chunk path=%s len=%u",
sysprof_document_file_chunk_get_path (SYSPROF_DOCUMENT_FILE_CHUNK (frame)),
sysprof_document_file_chunk_get_size (SYSPROF_DOCUMENT_FILE_CHUNK (frame)));
else if (SYSPROF_IS_DOCUMENT_FORK (frame))
g_print (" child-pid=%d",
sysprof_document_fork_get_child_pid (SYSPROF_DOCUMENT_FORK (frame)));
else if (SYSPROF_IS_DOCUMENT_OVERLAY (frame))
g_print (" layer=%u source=%s destination=%s",
sysprof_document_overlay_get_layer (SYSPROF_DOCUMENT_OVERLAY (frame)),
sysprof_document_overlay_get_source (SYSPROF_DOCUMENT_OVERLAY (frame)),
sysprof_document_overlay_get_destination (SYSPROF_DOCUMENT_OVERLAY (frame)));
else if (SYSPROF_IS_DOCUMENT_MMAP (frame))
g_print (" begin=0x%"G_GINT64_MODIFIER"x end=0x%"G_GINT64_MODIFIER"x offset=0x%"G_GINT64_MODIFIER"x path=%s",
sysprof_document_mmap_get_start_address (SYSPROF_DOCUMENT_MMAP (frame)),
sysprof_document_mmap_get_end_address (SYSPROF_DOCUMENT_MMAP (frame)),
sysprof_document_mmap_get_file_offset (SYSPROF_DOCUMENT_MMAP (frame)),
sysprof_document_mmap_get_file (SYSPROF_DOCUMENT_MMAP (frame)));
else if (SYSPROF_IS_DOCUMENT_JITMAP (frame))
g_print (" n_jitmaps=%u",
sysprof_document_jitmap_get_size (SYSPROF_DOCUMENT_JITMAP (frame)));
else if (SYSPROF_IS_DOCUMENT_DBUS_MESSAGE (frame))
g_print (" message-length=%u serial=0x%x sender=%s destination=%s",
sysprof_document_dbus_message_get_message_length (SYSPROF_DOCUMENT_DBUS_MESSAGE (frame)),
sysprof_document_dbus_message_get_serial (SYSPROF_DOCUMENT_DBUS_MESSAGE (frame)),
sysprof_document_dbus_message_get_sender (SYSPROF_DOCUMENT_DBUS_MESSAGE (frame)),
sysprof_document_dbus_message_get_destination (SYSPROF_DOCUMENT_DBUS_MESSAGE (frame)));
else if (SYSPROF_IS_DOCUMENT_CTRDEF (frame))
{
guint n_counters = sysprof_document_ctrdef_get_n_counters (SYSPROF_DOCUMENT_CTRDEF (frame));
g_print (" n_counters=%u", n_counters);
for (guint j = 0; j < n_counters; j++)
{
const char *category, *name;
guint id, type;
sysprof_document_ctrdef_get_counter (SYSPROF_DOCUMENT_CTRDEF (frame),
j, &id, &type, &category, &name, NULL);
g_print (" [%u<%s>:%s.%s]",
id,
type == SYSPROF_CAPTURE_COUNTER_INT64 ? "i64" : "f64",
category, name);
}
}
else if (SYSPROF_IS_DOCUMENT_CTRSET (frame))
{
guint n_values = sysprof_document_ctrset_get_n_values (SYSPROF_DOCUMENT_CTRSET (frame));
g_print (" counters=[");
for (guint j = 0; j < n_values; j++)
{
guint id;
guint8 raw[8];
sysprof_document_ctrset_get_raw_value (SYSPROF_DOCUMENT_CTRSET (frame), j, &id, raw);
g_print ("%u", id);
if (j+1 != n_values)
g_print (", ");
}
g_print ("]");
}
else if (SYSPROF_IS_DOCUMENT_ALLOCATION (frame))
{
if (sysprof_document_allocation_is_free (SYSPROF_DOCUMENT_ALLOCATION (frame)))
g_print (" 0x%016"G_GINT64_MODIFIER"x: free",
sysprof_document_allocation_get_address (SYSPROF_DOCUMENT_ALLOCATION (frame)));
else
g_print (" 0x%016"G_GINT64_MODIFIER"x: allocate %"G_GUINT64_FORMAT,
sysprof_document_allocation_get_address (SYSPROF_DOCUMENT_ALLOCATION (frame)),
sysprof_document_allocation_get_size (SYSPROF_DOCUMENT_ALLOCATION (frame)));
}
if (SYSPROF_IS_DOCUMENT_TRACEABLE (frame))
g_print (" stack-depth=%u",
sysprof_document_traceable_get_stack_depth (SYSPROF_DOCUMENT_TRACEABLE (frame)));
g_print ("\n");
g_clear_object (&frame);
}
g_printerr ("%u frames\n", n_items);
return 0;
}