valgrind检测FFmpeg转码程序出现Assertion 'iFuncWrapper'失败如何解决
错误产生原因
该错误是valgrind的内存重定向模块与FFmpeg的动态符号包装逻辑发生版本兼容性冲突导致,和你编写的业务代码无关:
valgrind的m_redir.c模块负责实现运行时的符号劫持、内存访问拦截逻辑,而部分版本的FFmpeg(4.x~5.0为主)的libavutil模块自带了平台优化用的动态函数重定向机制,二者的符号劫持逻辑相互干扰,导致valgrind找不到预期的函数包装器条目,直接触发断言失败中断程序,无法完成内存泄漏检测流程。
你自己的程序编译运行无异常,也证明业务逻辑本身不存在导致崩溃的问题。
修复方案
- 方案1:调整valgrind版本
该冲突集中出现在valgrind 3.15.x~3.17.x版本搭配上述FFmpeg版本的组合,你可以将valgrind升级到3.18及以上版本,或者回退到3.14.x版本,即可直接规避冲突。 - 方案2:添加valgrind运行参数跳过冲突逻辑
执行valgrind命令时添加--smc-check=all-non-file参数,绕过冲突的自修改代码检测逻辑;如果是特定FFmpeg函数触发的冲突,还可以额外添加--ignored-function=avpriv_find_preset参数跳过对应函数的检测。 - 方案3:编译FFmpeg时关闭冲突特性
重新编译FFmpeg时添加配置参数--disable-asm或者--disable-fast-unaligned,关闭FFmpeg的动态函数包装优化,编译后的FFmpeg库就不会和valgrind的重定向模块产生冲突。 - 方案4:添加抑制规则过滤FFmpeg内部检测
如果你只需要检测自己编写的代码的内存泄漏,不需要检测FFmpeg内部的内存操作,可以执行valgrind时添加参数--suppressions=/usr/share/valgrind/default.supp(路径根据你的系统调整),同时添加FFmpeg专属的抑制规则过滤FFmpeg内部的符号检测,也能避免触发断言。
内容的提问来源于stack exchange,提问作者Christian Vorhemus
相关产品推荐
相关产品推荐

