查看进程
查找进程
# 查找进程
ps aux | grep <相关字段>
# 查看进程启动命令
ps <进程号>
查看线程
pidstat -t -p <pid>
查看进程的系统调用
strace <可执行文件>
ltrace <可执行文件>
查看进程的使用资源
cd /proc/<pid>
查看进程树
pstree
死锁调试
发生死锁的原因
- 互斥访问,同一份资源,只能被一个线程持有;
- 循环等待,两个锁,被两个线程同时使用,每个线程各持有一个锁;
- 线程崩溃,锁来不及释放,变得无法释放;
定位死锁线程
使用gdb运行程序:
gdb <可执行程序>
run
如果出现死锁,则父进程进入等待状态,不会归还终端,此时 Ctrl + c 即可中断父进程执行。
查看进程栈信息:
bt
如果发现了lock字样,就差不多是了。
然后切换到栈帧,查看源码,或者直接查看源码,就知道在等待什么资源了。
然后搜索源码,查找谁在持有被等待的资源,这样就可以定位到死锁的两个线程了。
解决死锁问题
- 规定锁的访问顺序
- 使用 RAII 类型
- 使用超时锁