找了2周的一个bug,鬼使神差的重现了这个bug

从2013-04-28找到2013-5-27,一共10天。提交了16次修正代码。

有时候是Segmentation fault.,有时候是Illegal instruction。死在了一个不可能死的地方(当然所有地方都不可能死,在程序员看来)。


最开始怀疑是用了空指针,所以加了很多assert(p != NULL),发现不管用。


然后用tcmalloc找,找到了一个,但是还是有问题。


然后用valgrind找,发现st无法支持,因为st用了setjump和longjump。


然后不断的看日志,发现在校正编码器时间之后,可能会出这个问题。

然后突然想到可能是清空直播队列,所以把client的速度调低,限制为10kbps。

果然就重现了。


出现的条件:

1. 低速的client:不是清空队列,而是st线程阻塞在Flush,即发送消息那里。

2. 更新metadata:会导致另外一个线程通知所有的client发送消息。

即两个st线程在Flush,都从队列取同一个消息,然后rtmp发送,然后删除指针,一个必然会成为野指针。


总结一下,这个bug实际上有三个原因:

1. tcmalloc找到的那个使用已经释放的指针,farm->GetSize()的问题。
2. illegal instrution可能是编译环境和运行环境不一样的问题。
3. 两个st-thread同时Flush,使用野指针的问题。
其中,1和3都已经修正,2为了保险起见,我会更改安装包,每个平台一个安装包。

你可能感兴趣的:(找了2周的一个bug,鬼使神差的重现了这个bug)