使用Valgrind检查StateThreads内存泄漏—SRS对StateThreads的改进与完善
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
这个 patch 其实是 toffaletti 贡献的,SRS 把他合并过来了,整个 commit 其实很小,我们可以直接手动把它复制过 st-1.9
项目里面的。
复制完成之后,然后只需要在编译的时候加上一个宏 MD_VALGRIND
,就可以让 StateThreads 支持 Valgrind 了,如下:
make linux-debug EXTRA_CFLAGS="-DMD_VALGRIND"
其实好像不开启 MD_VALGRIND
,Valgrind 也可以检测出内存泄漏,如下:
不过协程上下文切换的时候 Valgrind 报了一个 Warning,我们开启 MD_VALGRIND
之后,这个 Warning 就会消失了。
可能是开启 MD_VALGRIND
之后,Valgrind 的检测会更准确。
下面讲一下 MD_VALGRIND
的实现逻辑,如下:
实际上就是在创建协程的时候用 VALGRIND_STACK_REGISTER
往 Valgrind 注册一下堆栈,然后退出协程的时候用 VALGRIND_STACK_DEREGISTER
销毁一下堆栈。
这两个函数的用法推荐阅读《使用和了解Valgrind核心:高级主题》
这个功能相关的 issue 跟 commit 如下:
https://github.com/ossrs/state-threads/issues/2
https://github.com/ossrs/state-threads/commit/4cca7a0272b70b184742dd68065af8a9a42e030f
不过这个功能基本用不到了,SRS 现在内存泄漏使用的是 asan,不再用 Valgrind 了,推荐阅读《SRS的内存泄漏检测工具ASAN》