libsysprof: join libsysprof-analyze and libsysprof-profile

This brings together the two libraries back into one now that the whole
design is pretty well sorted out. They depend on roughly the same libraries
anyway and it's way easier of the single library can both read and write
the capture files (along with bringing in libsysprof-capture symbols in
a single place).
This commit is contained in:
Christian Hergert
2023-07-19 17:40:41 -07:00
parent a990fc6b3c
commit dbb7833cbf
217 changed files with 187 additions and 316 deletions

View File

@ -0,0 +1,147 @@
#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_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;
}