mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
libsysprof-analyze: return symbols for context switches
This commit is contained in:
@ -23,11 +23,14 @@
|
|||||||
#include "sysprof-document-private.h"
|
#include "sysprof-document-private.h"
|
||||||
#include "sysprof-document-symbols-private.h"
|
#include "sysprof-document-symbols-private.h"
|
||||||
#include "sysprof-document-traceable.h"
|
#include "sysprof-document-traceable.h"
|
||||||
|
#include "sysprof-symbol-private.h"
|
||||||
#include "sysprof-symbolizer-private.h"
|
#include "sysprof-symbolizer-private.h"
|
||||||
|
|
||||||
struct _SysprofDocumentSymbols
|
struct _SysprofDocumentSymbols
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
|
SysprofSymbol *context_switches[SYSPROF_ADDRESS_CONTEXT_GUEST_USER+1];
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OBJECT)
|
G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OBJECT)
|
||||||
@ -35,6 +38,11 @@ G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OB
|
|||||||
static void
|
static void
|
||||||
sysprof_document_symbols_finalize (GObject *object)
|
sysprof_document_symbols_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
|
SysprofDocumentSymbols *self = (SysprofDocumentSymbols *)object;
|
||||||
|
|
||||||
|
for (guint i = 0; i < G_N_ELEMENTS (self->context_switches); i++)
|
||||||
|
g_clear_object (&self->context_switches[i]);
|
||||||
|
|
||||||
G_OBJECT_CLASS (sysprof_document_symbols_parent_class)->finalize (object);
|
G_OBJECT_CLASS (sysprof_document_symbols_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,14 +97,15 @@ sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self,
|
|||||||
for (guint i = 0; i < n_addresses; i++)
|
for (guint i = 0; i < n_addresses; i++)
|
||||||
{
|
{
|
||||||
SysprofAddress address = addresses[i];
|
SysprofAddress address = addresses[i];
|
||||||
SysprofAddressContext context;
|
SysprofAddressContext context = SYSPROF_ADDRESS_CONTEXT_NONE;
|
||||||
|
|
||||||
/* TODO: */
|
|
||||||
|
|
||||||
if (sysprof_address_is_context_switch (address, &context))
|
if (sysprof_address_is_context_switch (address, &context))
|
||||||
{
|
{
|
||||||
last_context = context;
|
last_context = context;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,6 +115,17 @@ sysprof_document_symbols_worker (GTask *task,
|
|||||||
gpointer task_data,
|
gpointer task_data,
|
||||||
GCancellable *cancellable)
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
|
static const struct {
|
||||||
|
const char *name;
|
||||||
|
guint value;
|
||||||
|
} context_switches[] = {
|
||||||
|
{ "- - Hypervisor - -", SYSPROF_ADDRESS_CONTEXT_HYPERVISOR },
|
||||||
|
{ "- - Kernel - -", SYSPROF_ADDRESS_CONTEXT_KERNEL },
|
||||||
|
{ "- - User - -", SYSPROF_ADDRESS_CONTEXT_USER },
|
||||||
|
{ "- - Guest - -", SYSPROF_ADDRESS_CONTEXT_GUEST },
|
||||||
|
{ "- - Guest Kernel - -", SYSPROF_ADDRESS_CONTEXT_GUEST_KERNEL },
|
||||||
|
{ "- - Guest User - -", SYSPROF_ADDRESS_CONTEXT_GUEST_USER },
|
||||||
|
};
|
||||||
Symbolize *state = task_data;
|
Symbolize *state = task_data;
|
||||||
GtkBitsetIter iter;
|
GtkBitsetIter iter;
|
||||||
GtkBitset *bitset;
|
GtkBitset *bitset;
|
||||||
@ -123,6 +143,21 @@ sysprof_document_symbols_worker (GTask *task,
|
|||||||
bitset = _sysprof_document_traceables (state->document);
|
bitset = _sysprof_document_traceables (state->document);
|
||||||
model = G_LIST_MODEL (state->document);
|
model = G_LIST_MODEL (state->document);
|
||||||
|
|
||||||
|
/* Create static symbols for context switch use */
|
||||||
|
for (guint cs = 0; cs < G_N_ELEMENTS (context_switches); cs++)
|
||||||
|
{
|
||||||
|
g_autoptr(GRefString) name = g_ref_string_new_intern (context_switches[cs].name);
|
||||||
|
g_autoptr(SysprofSymbol) symbol = _sysprof_symbol_new (name, NULL, NULL);
|
||||||
|
|
||||||
|
/* TODO: It would be nice if we had enough insight from the capture header
|
||||||
|
* as to the host system, so we can show "vmlinuz" and "Linux" respectively
|
||||||
|
* for binary-path and binary-nick when the capture came from Linux.
|
||||||
|
*/
|
||||||
|
|
||||||
|
state->symbols->context_switches[context_switches[cs].value] = g_steal_pointer (&symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Walk through the available traceables which need symbols extracted */
|
||||||
if (gtk_bitset_iter_init_first (&iter, bitset, &i))
|
if (gtk_bitset_iter_init_first (&iter, bitset, &i))
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@ -194,7 +229,13 @@ sysprof_document_symbols_lookup (SysprofDocumentSymbols *self,
|
|||||||
SysprofAddressContext context,
|
SysprofAddressContext context,
|
||||||
SysprofAddress address)
|
SysprofAddress address)
|
||||||
{
|
{
|
||||||
|
SysprofAddressContext new_context;
|
||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_DOCUMENT_SYMBOLS (self), NULL);
|
g_return_val_if_fail (SYSPROF_IS_DOCUMENT_SYMBOLS (self), NULL);
|
||||||
|
g_return_val_if_fail (context <= SYSPROF_ADDRESS_CONTEXT_GUEST_USER, NULL);
|
||||||
|
|
||||||
|
if (sysprof_address_is_context_switch (address, &new_context))
|
||||||
|
return self->context_switches[new_context];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,28 +43,20 @@ symbolize_cb (GObject *object,
|
|||||||
for (guint j = 0; j < depth; j++)
|
for (guint j = 0; j < depth; j++)
|
||||||
{
|
{
|
||||||
SysprofAddress address = sysprof_document_traceable_get_stack_address (traceable, j);
|
SysprofAddress address = sysprof_document_traceable_get_stack_address (traceable, j);
|
||||||
|
SysprofSymbol *symbol = sysprof_document_symbols_lookup (symbols, pid, last_context, address);
|
||||||
SysprofAddressContext context;
|
SysprofAddressContext context;
|
||||||
|
|
||||||
if (!sysprof_address_is_context_switch (address, &context))
|
if (sysprof_address_is_context_switch (address, &context))
|
||||||
{
|
last_context = context;
|
||||||
SysprofSymbol *symbol = sysprof_document_symbols_lookup (symbols, pid, last_context, address);
|
|
||||||
|
|
||||||
if (symbol != NULL)
|
if (symbol != NULL)
|
||||||
g_print (" %02d: %p: %s [%s]\n",
|
g_print (" %02d: %p: %s [%s]\n",
|
||||||
j,
|
j,
|
||||||
GSIZE_TO_POINTER (address),
|
GSIZE_TO_POINTER (address),
|
||||||
sysprof_symbol_get_name (symbol),
|
sysprof_symbol_get_name (symbol),
|
||||||
sysprof_symbol_get_binary_path (symbol));
|
sysprof_symbol_get_binary_path (symbol) ?: "<unresolved>");
|
||||||
else
|
|
||||||
g_print (" %02d: %p\n", j, GSIZE_TO_POINTER (address));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
g_print (" %02d: %p\n", j, GSIZE_TO_POINTER (address));
|
||||||
last_context = context;
|
|
||||||
g_print (" %02d: %s\n",
|
|
||||||
j, sysprof_address_context_to_string (context));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_print (" ================\n");
|
g_print (" ================\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user