从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()的问题。