后端开发时常要用到多线程。涉及多线程就可能发生死锁,所以在给线程传入参数时,检查读写区域,是否被公用。如果有,可以加锁,也可以指定一块新的内存地址。
下面主要介绍下如何调试死锁线程。主要采用pstack和gdb两个工具。
1.pstack 是 Linux(比如 Red Hat Linux 系统、Ubuntu Linux 系统等)下一个很有用的工具,它的功能是打印输出此进程的堆栈信息。可以输出所有线程的调用关系栈。
2.GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。Linux 系统中包含了 GNU 调试程序 gdb,它是一个用来调试 C 和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况 .
调试流程如下
- 查找程序的进程号
ps -ef|grep Process_Name
2.打印进程的堆栈信息
pstack Process_NO
- 多次执行上述命令,比较哪几个线程有共同的函数入口,再比较传入参数地址。
- 找到是哪个线程死锁之后,再启动gdb
gdb
- 启动之后,attach到死锁进程
attach Process_NO
- 查看进程堆栈信息
info thread
- 刚才我们已经初步定位了死锁的线程,现在切换到该线程
thread NO
- 进入到线程后,再查看线程栈信息
backtrace
- 切换到另一个线程,查看栈信息
thread NO_2
反复比较,能够看出,具体是哪一块内存触发死锁。