Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Don't deadlock in dl_iterate_phdr for heaptrack_inject
When we call dl_iterate_phdr we need to have the heaptrack mutex locked, otherwise we can get a AB/BA deadlock like this: One thread is trying to update the module cache: ``` Thread 4 (Thread 0xffffa8e1ef40 (LWP 10016) "system-ui-execu"): #0 futex_wait (private=0, expected=2, futex_word=0xffffb13bcad0 <_rtld_global+2744>) at ../sysdeps/nptl/futex-internal.h:146 #1 __GI___lll_lock_wait (futex=futex@entry=0xffffb13bcad0 <_rtld_global+2744>, private=private@entry=0) at lowlevellock.c:49 #2 0x0000ffffae7437b0 in lll_mutex_lock_optimized (mutex=0xffffb13bcad0 <_rtld_global+2744>) at pthread_mutex_lock.c:48 #3 ___pthread_mutex_lock (mutex=mutex@entry=0xffffb13bcad0 <_rtld_global+2744>) at pthread_mutex_lock.c:128 #4 0x0000ffffae7ed6ec in __GI___dl_iterate_phdr (callback=0xffffb1366d10 <(anonymous namespace)::HeapTrack::dl_iterate_phdr_callback(dl_phdr_info*, size_t, void*)>, data=0xffffa8e1e2d0) at dl-iteratephdr.c:39 #5 0x0000ffffb136982c in (anonymous namespace)::HeapTrack::updateModuleCache (this=0xffffa8e1e2d0) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:636 #6 (anonymous namespace)::HeapTrack::handleMalloc (this=this@entry=0xffffa8e1e2d0, ptr=ptr@entry=0xffff9c000b70, size=size@entry=16, trace=...) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:527 #7 0x0000ffffb13699f8 in (anonymous namespace)::HeapTrack::handleMalloc (trace=..., size=16, ptr=0xffff9c000b70, this=0xffffa8e1e2d0) at /home/milian/projects/kde/src/heaptrack/src/util/linewriter.h:271 #8 operator() (heaptrack=..., __closure=<optimized out>) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:880 #9 (anonymous namespace)::HeapTrack::op<heaptrack_malloc(void*, size_t)::<lambda((anonymous namespace)::HeapTrack&)> > (op=...) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:273 #10 heaptrack_malloc (ptr=0xffff9c000b70, size=16) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:880 #11 0x0000ffffb1364484 in (anonymous namespace)::hooks::malloc::hook (size=<optimized out>) at /home/milian/projects/kde/src/heaptrack/src/track/heaptrack_inject.cpp:120 #12 0x0000ffffae942a50 in operator new(unsigned long) () from /usr/lib/libstdc++.so.6 ``` The other one is trying to overwrite symbols: ``` Thread 1 (Thread 0xffffb0a8d020 (LWP 10011) "system-ui-execu"): #0 0x0000ffffae774560 in __GI___clock_nanosleep (clock_id=<optimized out>, clock_id@entry=0, flags=flags@entry=0, req=0xfffff3152150, rem=0xfffff3152150) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:48 #1 0x0000ffffae779520 in __GI___nanosleep (req=<optimized out>, rem=<optimized out>) at ../sysdeps/unix/sysv/linux/nanosleep.c:25 #2 0x0000ffffb13699b4 in std::this_thread::sleep_for<long, std::ratio<1l, 1000000l> > (__rtime=..., __rtime=...) at /home/milian/projects/kdab/vorwerk/sdk/sysroots/cortexa53-crypto-veld-linux/usr/include/c++/11.4.0/bits/this_thread_sleep.h:82 #3 (anonymous namespace)::HeapTrack::tryLock<(anonymous namespace)::HeapTrack::op<heaptrack_malloc(void*, size_t)::<lambda((anonymous namespace)::HeapTrack&)> >(const (anonymous namespace)::RecursionGuard&, const heaptrack_malloc(void*, size_t)::<lambda((anonymous namespace)::HeapTrack&)>&)::<lambda()> > (stopLockCheck=...) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:676 #4 (anonymous namespace)::HeapTrack::op<heaptrack_malloc(void*, size_t)::<lambda((anonymous namespace)::HeapTrack&)> > (op=...) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:265 #5 heaptrack_malloc (ptr=0xaaaafeb07b10, size=55) at /home/milian/projects/kde/src/heaptrack/src/track/libheaptrack.cpp:880 #6 0x0000ffffb1364484 in (anonymous namespace)::hooks::malloc::hook (size=<optimized out>) at /home/milian/projects/kde/src/heaptrack/src/track/heaptrack_inject.cpp:120 #7 0x0000ffffae942a50 in operator new(unsigned long) () from /usr/lib/libstdc++.so.6 #8 0x0000ffffb1365464 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*> (__end=0xffffb13b5856 "", __beg=0xffffb13b5820 "/mnt/appfs/nwot-appfs1/usr/lib/libutility-framework.so", this=0xfffff3152468) at /home/milian/projects/kdab/vorwerk/sdk/sysroots/cortexa53-crypto-veld-linux/usr/include/c++/11.4.0/bits/basic_string.tcc:219 #9 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (__a=..., __s=0xffffb13b5820 "/mnt/appfs/nwot-appfs1/usr/lib/libutility-framework.so", this=0xfffff3152468) at /home/milian/projects/kdab/vorwerk/sdk/sysroots/cortexa53-crypto-veld-linux/usr/include/c++/11.4.0/bits/basic_string.h:539 #10 (anonymous namespace)::cachedSymtabSize (path=<optimized out>) at /home/milian/projects/kde/src/heaptrack/src/track/heaptrack_inject--Type <RET> for more, q to quit, c to continue without paging-- .cpp:555 #11 (anonymous namespace)::iterate_phdrs (info=0xfffff31525d0, data=0x0) at /home/milian/projects/kde/src/heaptrack/src/track/heaptrack_inject.cpp:577 #12 0x0000ffffae7ed7f0 in __GI___dl_iterate_phdr (callback=0xffffb1364ea0 <(anonymous namespace)::iterate_phdrs(dl_phdr_info*, size_t, void*)>, data=0x0) at dl-iteratephdr.c:74 #13 0x0000ffffb1364870 in (anonymous namespace)::overwrite_symbols () at /home/milian/projects/kde/src/heaptrack/src/track/heaptrack_inject.cpp:589 ```
- Loading branch information