diff --git a/src/libsysprof-analyze/sysprof-callgraph.c b/src/libsysprof-analyze/sysprof-callgraph.c index 9d711d01..b6bff950 100644 --- a/src/libsysprof-analyze/sysprof-callgraph.c +++ b/src/libsysprof-analyze/sysprof-callgraph.c @@ -209,6 +209,7 @@ static void sysprof_callgraph_add_traceable (SysprofCallgraph *self, SysprofDocumentTraceable *traceable) { + SysprofAddressContext final_context; SysprofCallgraphNode *node; SysprofSymbol **symbols; guint stack_depth; @@ -225,7 +226,11 @@ sysprof_callgraph_add_traceable (SysprofCallgraph *self, return; 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 <= stack_depth); diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index 301ea9ad..553e2203 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -1062,6 +1062,8 @@ sysprof_document_list_jitmaps (SysprofDocument *self) * @traceable: the traceable to extract symbols for * @symbols: an array to store #SysprofSymbols * @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. * @@ -1074,7 +1076,8 @@ guint sysprof_document_symbolize_traceable (SysprofDocument *self, SysprofDocumentTraceable *traceable, SysprofSymbol **symbols, - guint n_symbols) + guint n_symbols, + SysprofAddressContext *final_context) { SysprofAddressContext last_context = SYSPROF_ADDRESS_CONTEXT_NONE; 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); if (n_symbols == 0 || symbols == NULL) - return 0; + goto finish; 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)); @@ -1107,6 +1110,10 @@ sysprof_document_symbolize_traceable (SysprofDocument *self, last_context = context; } +finish: + if (final_context) + *final_context = last_context; + return n_symbolized; } diff --git a/src/libsysprof-analyze/sysprof-document.h b/src/libsysprof-analyze/sysprof-document.h index 96377270..4cb29292 100644 --- a/src/libsysprof-analyze/sysprof-document.h +++ b/src/libsysprof-analyze/sysprof-document.h @@ -55,7 +55,8 @@ SYSPROF_AVAILABLE_IN_ALL guint sysprof_document_symbolize_traceable (SysprofDocument *self, SysprofDocumentTraceable *traceable, SysprofSymbol **symbols, - guint n_symbols); + guint n_symbols, + SysprofAddressContext *final_context); SYSPROF_AVAILABLE_IN_ALL void sysprof_document_callgraph_async (SysprofDocument *self, GListModel *traceables, diff --git a/src/libsysprof-analyze/tests/test-symbolize.c b/src/libsysprof-analyze/tests/test-symbolize.c index ec788011..31b6b1ab 100644 --- a/src/libsysprof-analyze/tests/test-symbolize.c +++ b/src/libsysprof-analyze/tests/test-symbolize.c @@ -62,7 +62,8 @@ load_cb (GObject *object, n_symbols = sysprof_document_symbolize_traceable (document, traceable, symbols, - G_N_ELEMENTS (symbols)); + G_N_ELEMENTS (symbols), + NULL); g_print ("%s depth=%u pid=%u\n", G_OBJECT_TYPE_NAME (traceable),