Multithreading 是否可以使用gdb检查哪些线程阻止pthread_cond_timedwait?

Multithreading 是否可以使用gdb检查哪些线程阻止pthread_cond_timedwait?,multithreading,mongodb,assembly,gdb,pthreads,Multithreading,Mongodb,Assembly,Gdb,Pthreads,我们的mongodb在生产中挂起了好几次,在我看来似乎出现了僵局 使用gdb,我们可以看到大多数线程挂起在pthread_cond_timedwait 有没有办法找出哪个线程持有锁 (gdb) bt full #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238 No locals. #1 0x0000000000bba2

我们的mongodb在生产中挂起了好几次,在我看来似乎出现了僵局

使用gdb,我们可以看到大多数线程挂起在pthread_cond_timedwait

有没有办法找出哪个线程持有锁

(gdb) bt full
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238
No locals.
#1  0x0000000000bba269 in mongo::CondVarLockGrantNotification::wait(unsigned int) ()
No symbol table info available.
#2  0x0000000000bbdd37 in mongo::LockerImpl<false>::lockComplete(mongo::ResourceId, mongo::LockMode, unsigned int, bool) ()
No symbol table info available.
#3  0x0000000000bb3ff9 in mongo::Lock::ResourceLock::lock(mongo::LockMode) ()

(gdb) info args
No symbol table info available.
(gdb) info locals
No locals.
(gdb) info registers
rax            0xfffffffffffffdfc   -516
rbx            0x7fb988055700   140434827728640
rcx            0xffffffffffffffff   -1
rdx            0x35a49  219721
rsi            0x189    393
rdi            0x636d752d4  26689884884
rbp            0x0  0x0
rsp            0x7fb988054a40   0x7fb988054a40
r8             0x636d752a8  26689884840
r9             0xffffffff   4294967295
r10            0x7fb988052990   140434827717008
r11            0x206    518
r12            0x0  0
r13            0x7fb9c9728060   140435925401696
r14            0xb9b0   47536
r15            0x7fb988055700   140434827728640
rip            0x7fb9c80a787d   0x7fb9c80a787d <clone+109>
eflags         0x206    [ PF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
(gdb)bt已满
#0 pthread_cond_timedwait@@GLIBC_2.3.2()位于../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:238
没有本地人。
#mongo中的1 0x0000000000bba269::CondVarLockGrantNotification::wait(unsigned int)()
没有可用的符号表信息。
#mongo::LockerImpl::lockComplete中的2 0x0000000000bbdd37(mongo::ResourceId,mongo::LockMode,unsigned int,bool)()
没有可用的符号表信息。
#mongo::Lock::ResourceLock::Lock(mongo::LockMode)()中的3 0x0000000000bb3ff9
(gdb)信息参数
没有可用的符号表信息。
(gdb)本地信息
没有本地人。
(gdb)信息寄存器
rax 0xFFFFFFFFFFFC-516
rbx 0x7fb988055700 140434827728640
rcx 0xFFFFFFFFFFFF-1
rdx 0x35a49 219721
rsi 0x189393
rdi 0x636d752d4 26689884884
rbp 0x0 0x0
rsp 0x7fb988054a40 0x7fb988054a40
r8 0x636d752a8 26689884840
r9 0xFFFFFFFF4294967295
r10 0x7fb988052990 140434827717008
r11 0x206 518
r12 0x0 0
r13 0x7fb9c9728060 140435925401696
r14 0xb9b0 47536
r15 0x7fb988055700 140434827728640
rip 0x7fb9c80a787d 0x7fb9c80a787d
eflags 0x206[PF IF]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0

使用带有调试符号的构建会更轻松。它仍然可以被优化,只需将
-g
与其他构建选项一起使用,并且不要剥离二进制文件<代码>gcc-O3-g。它仍将全速运行。您可能仍然需要查看asm以确定要检查的寄存器或内存位置。(请参阅asm调试提示的底部)实际上,使用记录哪个线程获得锁的插入指令的pthreads库可能会容易得多。IDK,如果存在的话,或者如果您可以通过环境变量影响glibc的行为。(锁定线程的标识通常不会记录在任何地方,因为这只是调试所需。)请参阅,但您可能只会得到线程0,请参阅,使用具有调试符号的生成会更容易。它仍然可以被优化,只需将
-g
与其他构建选项一起使用,并且不要剥离二进制文件<代码>gcc-O3-g。它仍将全速运行。您可能仍然需要查看asm以确定要检查的寄存器或内存位置。(请参阅asm调试提示的底部)实际上,使用记录哪个线程获得锁的插入指令的pthreads库可能会容易得多。IDK,如果存在的话,或者如果您可以通过环境变量影响glibc的行为。(锁定线程的标识通常不会记录在任何地方,因为这只是调试所需。)请参阅,但您可能只会得到线程0,请参阅