]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
eu-stacktrace: use Dwfl_Process_Tracker for Elf * caching
authorSerhei Makarov <serhei@serhei.io>
Tue, 28 Jan 2025 17:27:34 +0000 (12:27 -0500)
committerSerhei Makarov <serhei@serhei.io>
Tue, 28 Jan 2025 17:30:50 +0000 (12:30 -0500)
* src/stacktrace.c (tracker): New global variable.
  (sample_callbacks): Use dwfl_process_tracker_find_elf for caching.
  (sysprof_init_dwfl): Use dwfl_begin_with_tracker.
  (main): Initialize and clean up tracker.

src/stacktrace.c

index 3813e3409970189bb59d61889b002dbca7c7fa0a..566fcd753fff2ddc52e9300c1db8eeedbee84bb0 100644 (file)
@@ -633,6 +633,8 @@ static const Dwfl_Thread_Callbacks sample_thread_callbacks =
  * Dwfl and statistics table for multiple processes *
  ****************************************************/
 
+Dwfl_Process_Tracker *tracker = NULL;
+
 /* This echoes lib/dynamicsizehash.* with some necessary modifications. */
 typedef struct
 {
@@ -865,7 +867,7 @@ static char *debuginfo_path = NULL;
 
 static const Dwfl_Callbacks sample_callbacks =
   {
-    .find_elf = dwfl_linux_proc_find_elf,
+    .find_elf = dwfl_process_tracker_find_elf,
     .find_debuginfo = dwfl_standard_find_debuginfo,
     .debuginfo_path = &debuginfo_path,
   };
@@ -891,7 +893,7 @@ nop_find_debuginfo (Dwfl_Module *mod __attribute__((unused)),
 
 static const Dwfl_Callbacks sample_callbacks =
 {
-  .find_elf = dwfl_linux_proc_find_elf,
+  .find_elf = dwfl_process_tracker_find_elf,
   .find_debuginfo = nop_find_debuginfo, /* work with CFI only */
 };
 
@@ -1014,7 +1016,7 @@ sysprof_init_dwfl (struct sysprof_unwind_info *sui,
       cached = true;
       goto reuse;
     }
-  dwfl = dwfl_begin (&sample_callbacks);
+  dwfl = dwfl_begin_with_tracker (tracker);
 
   int err = dwfl_linux_proc_report (dwfl, pid);
   if (err < 0)
@@ -1508,6 +1510,7 @@ https://sourceware.org/cgit/elfutils/tree/README.eu-stacktrace?h=users/serhei/eu
   (void)maxframes;
 #else
   fprintf(stderr, "\n=== starting eu-stacktrace ===\n");
+  tracker = dwfl_process_tracker_begin (&sample_callbacks);
 
   /* TODO: For now, code the processing loop for sysprof only; generalize later. */
   assert (input_format == FORMAT_SYSPROF);
@@ -1591,5 +1594,7 @@ https://sourceware.org/cgit/elfutils/tree/README.eu-stacktrace?h=users/serhei/eu
   if (output_fd != -1)
     close (output_fd);
 
+  dwfl_process_tracker_end (tracker);
+
   return EXIT_OK;
 }