<死锁调试>

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怎么定位死锁位置?

 

posted @ 2025-07-04 21:29  一个不知道干嘛的小萌新  阅读(43)  评论(0)    收藏  举报