On Wed, 2024-08-14 at 11:54 -0700, Andrii Nakryiko wrote: > Add a new set of tests validating behavior of capturing stack traces > with build ID. We extend uprobe_multi target binary with ability to > trigger uprobe (so that we can capture stack traces from it), but also > we allow to force build ID data to be either resident or non-resident in > memory (see also a comment about quirks of MADV_PAGEOUT). > > That way we can validate that in non-sleepable context we won't get > build ID (as expected), but with sleepable uprobes we will get that > build ID regardless of it being physically present in memory. > > Also, we add a small add-on linker script which reorders > .note.gnu.build-id section and puts it after (big) .text section, > putting build ID data outside of the very first page of ELF file. This > will test all the relaxations we did in build ID parsing logic in kernel > thanks to freader abstraction. > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > --- Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> [...] > diff --git a/tools/testing/selftests/bpf/uprobe_multi.c b/tools/testing/selftests/bpf/uprobe_multi.c > index 7ffa563ffeba..c7828b13e5ff 100644 > --- a/tools/testing/selftests/bpf/uprobe_multi.c > +++ b/tools/testing/selftests/bpf/uprobe_multi.c [...] > +int __attribute__((weak)) trigger_uprobe(bool build_id_resident) > +{ > + int page_sz = sysconf(_SC_PAGESIZE); > + void *addr; > + > + /* page-align build ID start */ > + addr = (void *)((uintptr_t)&build_id_start & ~(page_sz - 1)); > + > + /* to guarantee MADV_PAGEOUT work reliably, we need to ensure that > + * memory range is mapped into current process, so we unconditionally > + * do MADV_POPULATE_READ, and then MADV_PAGEOUT, if necessary > + */ > + madvise(addr, page_sz, MADV_POPULATE_READ); Nit: check error code? > + if (!build_id_resident) > + madvise(addr, page_sz, MADV_PAGEOUT); > + > + (void)uprobe(); > + > + return 0; > +} > + [...] Silly question, unrelated to the patch-set itself. When I do ./test_progs -vvv -t build_id/sleepable five stack frames are printed: FRAME #00: BUILD ID = 46d2568fe293274105f9dad0cc73de54a176f368 OFFSET = 2c4156 FRAME #01: BUILD ID = 46d2568fe293274105f9dad0cc73de54a176f368 OFFSET = 393aef FRAME #02: BUILD ID = 8f53abaad945a669f2bdcd25f471d80e077568ef OFFSET = 2a088 FRAME #03: BUILD ID = 8f53abaad945a669f2bdcd25f471d80e077568ef OFFSET = 2a14b FRAME #04: BUILD ID = 46d2568fe293274105f9dad0cc73de54a176f368 OFFSET = 2c4095 The ...6f368 is build-id of the uprobe_multi. How do I check where ...568ef comes from? Also, why are there 5 frames when nesting level for uprobe() is 3?