多线程调试的一点技巧

多线程调试的一点技巧

最近几天遇到一个问题,程序在客户的虚拟机中跑了几分钟就不响应了。这实在是很无厘头的一件事情,因为在实体机以及相同配置的虚拟机里,居然无法重现这个问题,而客户几乎每次都重现。

问题本身不复杂。SIP协议栈收到SIP消息后,产生内部数据放入队列,同时通知UA进行处理。诡异的地方在于:UA层居然没有任何反应。初步判断是线程挂住了,可是不知道是什么原因导致的。于是乎各种修改、各种debug、各种打印都用上了,始终不得其解。

google了相关主题后发现其实也挺简单,使用gdb就可以(原谅一个一直使用IDE的人吧),比如程序名是mss:

(1)查找mss当前的pid:ps -A | grep mss

(2)假设pid为1234,则使用gdb调试:gdb mss 1234

(3)进入gdb后,使用bt命令即可查找当前堆栈情况,了解程序卡在什么位置。

(4)也可以使用info threads了解程序各线程的状况。

Comments are closed.