Browsed by
Tag: mutex

掉坑里了

掉坑里了

Qt无疑是个非常好的framework,我们一直用TA。虽然不敢说已经是行家里手,不过好歹也开发这么久程序了,渐渐地有些自负起来,因此掉坑里了。

坑来自Qt最经典的设计:signal-slot。我以前的理解这是异步的,常用于模块间解耦。在windows平台,这个理解似乎没错,signal-slot底层依赖window的message机制。而在linux平台,其实现方式默认仍然是callback机制。

callback机制在多线程编程里最容易出问题的就是“锁”。这次掉坑里,就是在slot中应用“锁”时不小心,导致了死锁。

这次竟然忘了这点! :-(

多线程调试的一点技巧

多线程调试的一点技巧

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

问题本身不复杂。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了解程序各线程的状况。