今天遇到一个lll_lock_wait的问题,分析之后得到的结论是死锁,觉得挺有意义的,值得把分析过程记录一下,顺便梳理Gdb调试程序的一般步骤。
一般,程序核心转储之后会生成一个core文件,可使用命令
gdb program core.xxx
调试,如果执行程序被扒了衣服(stripped),则最好将符号表文件也放在程序同一目录,以得到更多详细信息。
可先整体查看该进程下所有线程信息
info threads
或者,打印所有线程堆栈
thread apply all bt
切换到线程30,可执行
t 30
打印该线程的堆栈信息
bt
选择frame命令查看第五帧
f 5
打印当前类所有成员的值
set print pretty
p *this
当时gdb调试信息类似下面这样
(gdb) info thread
5 Thread 0x41e37940 (LWP 6722) 0x0000003d1a80d4c4 in __lll_lock_wait ()
from /lib64/libpthread.so.0
4 Thread 0x42838940 (LWP 6723) 0x0000003d1a80d4c4 in __lll_lock_wait ()
from /lib64/libpthread.so.0
3 Thread 0x43239940 (LWP 6724) 0x0000003d19c9a541 in nanosleep ()
from /lib64/libc.so.6
2 Thread 0x43c3a940 (LWP 6725) 0x0000003d19c9a541 in nanosleep ()
from /lib64/libc.so.6
1 Thread 0x2b984ecabd90 (LWP 6721) 0x0000003d1a807b35 in pthread_join ()
from /lib64/libpthread.so.0
很多时候程序并没有coredump,我们也可以gcore出来,或者干脆attach进程号,关于gdb调试其实有很多内容,程序调试也是件需要毅力、耐心和观察力的累活,就像侦探一样,从蛛丝马迹之中找寻真相。