C/C++进程未按预期执行,进程仍在后台运行,这种情况称为进程卡死,它往往是由于死锁或者进程进入死循环导致的。定位思路如C/C++进程卡死所示。
问题现象:
某软件在服务器上运行出现卡死问题。
定位过程:
gdb attach 2573
2573为该程序PID号。
1 2 3 | set logging file core_info.log set logging on thread apply all bt |
1 | info threads
|
绝大部分线程都处在等待状态__lll_lock_wait。其中,等待的锁变量主要有两个,resource1和resource2。
可见,resource1由线程3889持有未释放,resource2由线程3892持有未释放。
从这两个线程的状态信息可以看出,3889号线程持有了锁resource1,但是本身在请求resource2;而3892号线程持有了锁resource2,但是本身在请求resource1。这两个线程的锁调用关系构成了死锁条件导致无法退出,同时,其他所有依赖这两个锁的线程都陷入了等待状态。