srs crash,edge状态异常,terminate called after throwing an instance of 'std::bad_alloc' #509
Comments
|
我也遇到了 2.0a2版 |
|
请提供配置,日志,版本,重现步骤。谢谢~ |
|
我的配置很简单,就是自带配置文件的origin.conf和edge.conf, 把edge.conf里的origin改为了自己的服务器域名。1个origin,2个edge。有5个左右的推流和50个左右的拉流。 origin和edge都出现过挂掉。
如果有需要可以提供core dump文件 |
|
请将core和对应的srs发给我吧,放网盘上也可以,是centos么? |
|
centos 7 64bit的, 相关文件 http://pan.baidu.com/s/1pJGLnyN |
|
嗯,我找时间看看。 |
可见edge对象没有破坏。
可见对象已经释放了,再使用肯定会有问题。 |
堆栈。 |
说明是完成了c0c1,但是还没有收到s0s1s2。这个是不可能的执行路径:
在 |
|
再次观察hs_bytes:
其中c0应该是0x03,实际上是0xc8 |
|
在看堆栈:
这个地方看到的hs_bytes是和之前的不一样的,这个说明了complex_hs.handshake_with_server里面发生了问题。而在f1这个地方,c0c1是堆指针,而且数据是03开头的,没有破坏。 |
从io的数据来看,收到了3073字节(s0s1s2),发送了1537字节(c0c1),可能是在处理s0s1s2的时候出的问题。 |
|
这块可能是栈上开辟对象导致的问题,改成堆开辟吧。 |
|
https://stackoverflow.com/a/2504601
|
|
这个文章分析了bad_alloc并非总是OOM:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1404r1.html 写了一个实例,如下:
执行就会崩溃:
看堆栈不是分配大头,而是分配小头的地方:
|
|
加了一个gdb的脚本,分析了下core中的coroutine的数目,代码srs.py先下载下来:
ST默认是用mmap开辟coroutine的栈空间,所以超过一定数量就会失败,这个数量可以通过这个查看:
然后编译这个代码huge-threads.cpp,执行:
一般就会挂在3万个左右coroutine这里:
这个解法有两个:
|
srs 在拉流的时候出现自动退出
srs: src/app/srs_app_edge.cpp:766: virtual int SrsPlayEdge::on_ingest_play(): Assertion `state == SrsEdgeStatePlay' failed.
The text was updated successfully, but these errors were encountered: