mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 15:10:53 +00:00
libsysprof-analyze: include final address context
We may need to know the final address context so we can inject symbols as necessary into the top of the callgraph. We know it when generating the symbols, so just yield it to the caller too.
This commit is contained in:
@ -209,6 +209,7 @@ static void
|
|||||||
sysprof_callgraph_add_traceable (SysprofCallgraph *self,
|
sysprof_callgraph_add_traceable (SysprofCallgraph *self,
|
||||||
SysprofDocumentTraceable *traceable)
|
SysprofDocumentTraceable *traceable)
|
||||||
{
|
{
|
||||||
|
SysprofAddressContext final_context;
|
||||||
SysprofCallgraphNode *node;
|
SysprofCallgraphNode *node;
|
||||||
SysprofSymbol **symbols;
|
SysprofSymbol **symbols;
|
||||||
guint stack_depth;
|
guint stack_depth;
|
||||||
@ -225,7 +226,11 @@ sysprof_callgraph_add_traceable (SysprofCallgraph *self,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
symbols = g_newa (SysprofSymbol *, stack_depth + 2);
|
symbols = g_newa (SysprofSymbol *, stack_depth + 2);
|
||||||
n_symbols = sysprof_document_symbolize_traceable (self->document, traceable, symbols, stack_depth);
|
n_symbols = sysprof_document_symbolize_traceable (self->document,
|
||||||
|
traceable,
|
||||||
|
symbols,
|
||||||
|
stack_depth,
|
||||||
|
&final_context);
|
||||||
|
|
||||||
g_assert (n_symbols > 0);
|
g_assert (n_symbols > 0);
|
||||||
g_assert (n_symbols <= stack_depth);
|
g_assert (n_symbols <= stack_depth);
|
||||||
|
|||||||
@ -1062,6 +1062,8 @@ sysprof_document_list_jitmaps (SysprofDocument *self)
|
|||||||
* @traceable: the traceable to extract symbols for
|
* @traceable: the traceable to extract symbols for
|
||||||
* @symbols: an array to store #SysprofSymbols
|
* @symbols: an array to store #SysprofSymbols
|
||||||
* @n_symbols: the number of elements in @symbols
|
* @n_symbols: the number of elements in @symbols
|
||||||
|
* @final_context: (out) (nullable): a location to store the last address
|
||||||
|
* context of the stack trace.
|
||||||
*
|
*
|
||||||
* Batch symbolizing of a traceable.
|
* Batch symbolizing of a traceable.
|
||||||
*
|
*
|
||||||
@ -1074,7 +1076,8 @@ guint
|
|||||||
sysprof_document_symbolize_traceable (SysprofDocument *self,
|
sysprof_document_symbolize_traceable (SysprofDocument *self,
|
||||||
SysprofDocumentTraceable *traceable,
|
SysprofDocumentTraceable *traceable,
|
||||||
SysprofSymbol **symbols,
|
SysprofSymbol **symbols,
|
||||||
guint n_symbols)
|
guint n_symbols,
|
||||||
|
SysprofAddressContext *final_context)
|
||||||
{
|
{
|
||||||
SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE;
|
SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE;
|
||||||
const SysprofProcessInfo *process_info;
|
const SysprofProcessInfo *process_info;
|
||||||
@ -1087,7 +1090,7 @@ sysprof_document_symbolize_traceable (SysprofDocument *self,
|
|||||||
g_return_val_if_fail (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable), 0);
|
g_return_val_if_fail (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable), 0);
|
||||||
|
|
||||||
if (n_symbols == 0 || symbols == NULL)
|
if (n_symbols == 0 || symbols == NULL)
|
||||||
return 0;
|
goto finish;
|
||||||
|
|
||||||
pid = sysprof_document_frame_get_pid (SYSPROF_DOCUMENT_FRAME (traceable));
|
pid = sysprof_document_frame_get_pid (SYSPROF_DOCUMENT_FRAME (traceable));
|
||||||
process_info = g_hash_table_lookup (self->pid_to_process_info, GINT_TO_POINTER (pid));
|
process_info = g_hash_table_lookup (self->pid_to_process_info, GINT_TO_POINTER (pid));
|
||||||
@ -1107,6 +1110,10 @@ sysprof_document_symbolize_traceable (SysprofDocument *self,
|
|||||||
last_context = context;
|
last_context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
finish:
|
||||||
|
if (final_context)
|
||||||
|
*final_context = last_context;
|
||||||
|
|
||||||
return n_symbolized;
|
return n_symbolized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,8 @@ SYSPROF_AVAILABLE_IN_ALL
|
|||||||
guint sysprof_document_symbolize_traceable (SysprofDocument *self,
|
guint sysprof_document_symbolize_traceable (SysprofDocument *self,
|
||||||
SysprofDocumentTraceable *traceable,
|
SysprofDocumentTraceable *traceable,
|
||||||
SysprofSymbol **symbols,
|
SysprofSymbol **symbols,
|
||||||
guint n_symbols);
|
guint n_symbols,
|
||||||
|
SysprofAddressContext *final_context);
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
void sysprof_document_callgraph_async (SysprofDocument *self,
|
void sysprof_document_callgraph_async (SysprofDocument *self,
|
||||||
GListModel *traceables,
|
GListModel *traceables,
|
||||||
|
|||||||
@ -62,7 +62,8 @@ load_cb (GObject *object,
|
|||||||
n_symbols = sysprof_document_symbolize_traceable (document,
|
n_symbols = sysprof_document_symbolize_traceable (document,
|
||||||
traceable,
|
traceable,
|
||||||
symbols,
|
symbols,
|
||||||
G_N_ELEMENTS (symbols));
|
G_N_ELEMENTS (symbols),
|
||||||
|
NULL);
|
||||||
|
|
||||||
g_print ("%s depth=%u pid=%u\n",
|
g_print ("%s depth=%u pid=%u\n",
|
||||||
G_OBJECT_TYPE_NAME (traceable),
|
G_OBJECT_TYPE_NAME (traceable),
|
||||||
|
|||||||
Reference in New Issue
Block a user