Multithreading 是否可以使用gdb检查哪些线程阻止pthread_cond_timedwait?
我们的mongodb在生产中挂起了好几次,在我看来似乎出现了僵局 使用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
(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,请参阅