1. 问题背景

最近在用瑞芯微3588开发板做一个视频处理的项目,前两天拷机发生了闪退,弹出的问题是“打开文件过多”,经过初步排查定位到是MPP硬解码部分出的问题。

我的MPP解码部分主要用来读取网络相机rtsp流,主要参考了一个github项目GitHub - MUZLATAN/ffmpeg_rtsp_mpp: ffmpeg 拉取rtsp h264流, 使用mpp解码, 目前在firefly 板子上跑通了

我将它封装成C++类的形式,方便使用。最开始使用是没有问题的,但是在我加了一个相机异常处理机制的时候,就出现了“打开文件过多”的问题。这个相机异常处理机制主要是解决相机未连接、断电重连的时候,软件依然正常运行,而且在相机重连之后可以重新读取画面,而软件不需要重启。

我的解决办法是,如果检测到无法从相机获取数据了,就调用析构函数释放掉解码器(我封装的那个类),然后重新实例化解码类尝试连接相机。那个项目里,获取相机数据采用的是ffmpeg的av_read_frame,然后用mpp调用硬件进行解码。

if (av_read_frame(pFormatCtx, av_packet) < 0) //从相机获取数据{printf("av_read_frame get packet failed!");return -1;}

在我尝试多次插拔相机之后,软件就出现了文章开头的问题:打开文件过多。

2. 问题现象及分析

问题现象主要分为两种,一种是相机一直连接或者一直不连接,这样软件不会出现问题;第二种是相机时而连接,时而不连接,就会导致“文件打开过多”。

经过查阅,得知rk3588开发板的每个进程最多能打开1024个文件

利用lsof指令实时监控软件打开的文件数

lsof -p 进程号 | wc -l

发现打开的文件数量确实在一直上涨,而且也确实发生在插拔相机的时候。但是现在并不清楚到底泄露了什么资源,可以进一步查看进程具体打开了哪些文件

查看软件打开的文件:

ls -l /proc/进程id/fd

可以看出来,每次插拔相机都导致一个mpp_service和若干个dmabuf增加,也就是泄露。

所以,原因应该也很明显了,就是解码器释放的时候没有完全释放掉资源,下面就需要排查代码了。

3. 问题解决

启动人眼搜索大法,一行行排查代码,看到疑似申请了资源的代码都详细查看一下

最后定位到两个函数:

第一个函数mpp_create会申请mpp services,是导致mpp_services泄露的根源;

第二个函数mpp_buffer_group_get会申请缓冲区暂存解码出来的图像。

在两个函数头文件声明的地方,也都发现了相应的释放函数:

添加到析构函数中,问题解决~

4. 总结

这么想来,RAII真是福音,修改后的代码已放到这儿了

MPP解码https://download.csdn.net/download/a1367666195/87925718?spm=1001.2014.3001.5503

RK3588 MPP解码句柄泄露问题记录相关推荐

  1. windbg调试实例(4)--句柄泄露

    同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...

  2. Windows 句柄泄露学习总结

    句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有 ...

  3. windbg调试句柄泄露

    本人系统是win7 64位,待调试程序是32位.这里使用的方法是真机配合虚拟机同时调试的方法来找出句柄泄露的源码位置. 如果真机直接使用X64版本的windbg侦测句柄泄露时显示: 0:000:x86 ...

  4. 微软收购暴雪计划遭拒/ Edge被曝泄露浏览记录/ 微信小程序可用数字人民币...今日更多新鲜事在此...

    日报君 发自 凹非寺 量子位 | 公众号 QbitAI 大家好,今天是4月27日星期四,是这个月倒数第二天上班了~ 在假期可以翘首以待的日子里,还是来和日报君看看今天的科技圈资讯吧~ 微信支持数字人民 ...

  5. RK3588 MPP,RGA,DRM,QT之RGA

    在上篇的MPP解码中我们说到了,当我们获取到了解码的帧后,如果我们有多路视频需要同时显示,如果路数不多的话,我们可以采用在不同的层上显示,但是显示视频的层是有限制的,这个时候,我们就需要把这些视频合成 ...

  6. 内存泄露解决记录——窗口资源释放

    前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题. http://blog.csdn.net/enjolras/archive/2011/01/05/6117628.aspx 这篇文章起到了很 ...

  7. windbg检测句柄泄露(定位到具体代码)

    原文 http://blog.csdn.net/yockie/article/details/40603511 摘要: windbg attach到目标进程 !htrace -enable 该命令会自 ...

  8. 一、CTF-Web-信息泄露(记录CTF学习)

    目录 1.源码泄露 1-1.页面源代码泄露 1-2.敏感文件泄露 1-2-1.备份(.swp/.bak/.beifen/~/phps等) 1-2-2.数据库(mdb) 1-2-3.压缩包(zip/ta ...

  9. RKMPP库快速上手--(三)MPP解码入门

    一.RKMPP整个解码流程简单介绍一下: 1. 创建 MPP context 和 MPP api 接口. (注意,和RGA一样,多个线程多个实例需要多个独立的的context) ret = mpp_c ...

最新文章

  1. matlab中文文档_Linux下Matlab安装
  2. GMM 模型需不需归一化问题
  3. 机器学习和计算机视觉相关的数学
  4. VS条件断点学习总结
  5. 事务内容postgresql pgbench
  6. git bash、eclipse中git插件提交出现冲突以及解决办法
  7. STM32的GPIO为输出模式时获取其输出状态
  8. 如何将dataset中的值赋值给datatable_金融行业实战项目:如何理解业务?
  9. mongodb运算操作符
  10. 一个单片机搞定USB电阻式触摸屏,完美解决飞点问题。
  11. Android开发笔记(五十五)手机设备基本操作
  12. android 8.1闪退,宁波市民卡app在Android 8.1闪退_宁波民生e点通
  13. 4.1 数据库的设置
  14. python脚本批量登录crt_python批量修改SecureCRT会话密码-阿里云开发者社区
  15. 关于Layer UI表格列日期格式化及取消自动填充日期
  16. H3C 无线控制器+瘦ap 配置
  17. [国家集训队] 矩阵乘法
  18. 精益创业实战 - 第5章 开始实验
  19. 计算机系统-大作业-hello的一生-哈尔滨工业大学2020级
  20. 高数_第5章常微分方程_二阶线性微分方程解的结构

热门文章

  1. android画板的实验报告,几何画板实验报告.doc
  2. 餐饮管理系统c语言答辩,软件工程专业本科毕业论文(餐饮管理系统)详解.doc
  3. 入驻亚马逊你该知道这些!—跨海汇
  4. 卧槽!这网站也太全了吧!!!学习、设计、开发、资源下载等各类高质量网站推荐【建议收藏】
  5. float和double的范围和精度
  6. mysql宕机日志查询_mysql宕机分析(事务日志损坏)
  7. Java学习day01——java基础
  8. 智能优化算法结果每次不一样的解决方法
  9. wordpress如何添加百度分享
  10. 体验管理 | 以 [ 新员工入职场景 ] 为例,教你如何设计员工体验?