> As removing the dwfl didn't prove possible, an alternative is to just not > discard the dwfl when the unwind ends. The dwfl is valid for a process unless > a dso is loaded at the same address as a previous one. So keep the dwfl with > the maps, invalidate it if a map is removed (in case a new map replaces it) > and recycle the dwfl in the unwinding code.
Relevant note: I'm looking at whether elfutils libdwfl_stacktrace might further help with these issues. The libdwfl_stacktrace library is currently shipped as an experimental addon to libdwfl in elfutils 0.194, but I'm intending to stabilize the API this year. There's code for some analogous functions: translating perf->dwarf register files, and caching Dwfl and Elf data to speed up unwinding across multiple processes. (Thus, if unwinding a collection of perf_events from 16 processes that use libc, we don't need to load the CFI for libc.so 16 times.) I think once I've stabilized the libdwfl_stacktrace API and expanded the register support to a larger set of perf-supported architectures, it makes sense for me to author a corresponding set of patches for perf. I'll see if it's worth adding more libdwflst functionality to elfutils 0.195 in anticipation of this. -- Serhei Makarov
