一个FD 的血泪史

本文记录了一次解决Android平板录像崩溃的问题分析过程。当从录像模式切换到预览模式时,由于HAL的ioctl调用错误,导致配置失败。经过strace系统调用跟踪和日志分析,发现是释放buffer时,未初始化的fd被错误关闭,根源在于userptr类型的buffer未进行export操作,导致fd为默认值0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要说明

测试现象:Camera 停止录像的时候会crash。 这个bug的复现概率比较大,原本以为应该会很快解决问题, 但是结果是实打实的花费了我一周的时间, 期间还请求了其他同事的帮助。 不过这个问题也还是第一次遇到, 自己也能静下心来分析root cause, 收获还是挺大的。本篇是基于intel Android 平板项目, 会涉及到相关保密信息, 所以不会提及代码相关的东西, 只提供问题分析思路和公用的调试方法。

问题认识

从测试报的bug 来看, 录像会crash。 分析了一下整个流程, 问题发生的时候, 录像的video可以正常生成, 但是录像模式到预览模式切换的时候,会不成功。 问题出现在预览配置的时候start失败(启动预览的流程: opencamera-config--start , 一般opencamera 只在 进入camera的时候调用一次, 之后的拍照录像等模式的切换,仅config--start)。

问题分析

迷雾缭绕

于是分析日志发现, start 失败的原因是 config失败了(config 失败在hal 看不到异常日志, 这也花了一些时间对比正常日志和异常日志才发现)。  config失败的原因是由于Hal 的一个ioctl 并没有被调用到 对应节点的driver, 而从hal的日志了来看, 并没有任何异常。

由于ioctl这块是v4l2的封装, 一度怀疑v4l2框架出现了问题, 很是纠结了一两天, 期间还找另外一位同事帮忙check, 发现的确是是config的时候, ioctl没有调用到对应的kernel的节点。 解决问题的步伐被停止了。 停下来 思考, v4l2是一个成熟的框架, 应该不会出现这种错误。

借助工具

摇确认问题, 首先去人ioctl的系统调用到底有没有成功, 如果没有成功, 因为这个是系统调用, 那说明, ioctl的系统调用可能真的有问题, 那就去找系统调度的问题了, 但是从直观感觉来说这种可能性极低; 如果调用成功了, 那么具体是调用到什么kernel位置?

strace, 该出场了, 用strace, 抓取系统调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值