<死锁调试>
1.怎么初步定位死锁
pstree:查看线程层级关系,辅助确认线程数量是否异常。
top -H:观察线程状态和CPU占用,初步筛选可疑线程。
ps -T:显示线程阻塞的内核函数(如 futex_wait),定位锁竞争。
死锁确认:需结合 gdb 或 strace 分析线程调用栈和系统调用。
4. 实际排查死锁的完整流程
步骤1:确认进程是否存在异常线程
| top -H -p <PID> # 观察是否有线程长期处于 `S` 或 `D` 状态 | |
| pstree -p <PID> # 确认线程数量是否异常 |
步骤2:检查线程阻塞位置
bash
| ps -T -p <PID> -o pid,tid,stat,wchan:32,cmd # 显示线程阻塞的内核函数 |
- 若多个线程阻塞在
futex_wait,可能因锁竞争导致死锁。
步骤3:使用 gdb 附加调试(高级)
bash
| gdb -p <PID> | |
| (gdb) info threads # 查看所有线程状态 | |
| (gdb) thread <TID> # 切换到目标线程 | |
| (gdb) bt # 查看线程调用栈 |
- 通过调用栈分析线程是否在等待无法获取的锁。
步骤4:使用 strace 跟踪系统调用
bash
| strace -p <TID> # 跟踪单个线程的系统调用 |
- 若线程卡在
futex(FUTEX_WAIT)调用,说明在等待锁。
如果不用gdb、strace怎么定位死锁位置?
浙公网安备 33010602011771号