From a0ce83eeadc83a3a518b2a158a851185192503d6 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Mon, 24 Jul 2023 17:31:51 -0700 Subject: [PATCH] libsysprof: provide build-id in MMAP2 event to capture writer We may not always get this value (in fact, I can't seem to actually get the Kernel to provide it to me locally), but should we actually get it this will send that along to the capture writer so it may add a @build-id\0 tail to the SysprofCaptureMap frame. --- src/libsysprof/sysprof-sampler.c | 40 +++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/libsysprof/sysprof-sampler.c b/src/libsysprof/sysprof-sampler.c index da3275c0..a0aa8a06 100644 --- a/src/libsysprof/sysprof-sampler.c +++ b/src/libsysprof/sysprof-sampler.c @@ -182,16 +182,38 @@ sysprof_sampler_perf_event_stream_cb (const SysprofPerfEvent *event, offset += sizeof (GPid) + sizeof (GPid); memcpy (&time, event->mmap2.filename + offset, sizeof time); - sysprof_capture_writer_add_map (writer, - time, - cpu, - event->mmap2.pid, - event->mmap2.addr, - event->mmap2.addr + event->mmap2.len, - event->mmap2.pgoff, - 0, - event->mmap2.filename); + if ((event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) != 0) + { + char build_id[G_N_ELEMENTS (event->mmap2.build_id) * 2 + 1]; + guint len = MIN (G_N_ELEMENTS (event->mmap2.build_id), event->mmap2.build_id_size); + for (guint i = 0; i < len; i++) + g_snprintf (&build_id[len*2], 3, "%02x", event->mmap2.build_id[i]); + build_id[len*2] = 0; + + sysprof_capture_writer_add_map_with_build_id (writer, + time, + cpu, + event->mmap2.pid, + event->mmap2.addr, + event->mmap2.addr + event->mmap2.len, + event->mmap2.pgoff, + event->mmap2.ino, + event->mmap2.filename, + build_id); + } + else + { + sysprof_capture_writer_add_map (writer, + time, + cpu, + event->mmap2.pid, + event->mmap2.addr, + event->mmap2.addr + event->mmap2.len, + event->mmap2.pgoff, + event->mmap2.ino, + event->mmap2.filename); + } break; case PERF_RECORD_READ: