1 关键字

appfreeze;APP_LIFECYCLE_TIMEOUT;

2 问题描述

设备OH版本:3.2release 稳定性压测过程中,相机出现appfreeze故障,故障信息为APP_LIFECYCLE_TIMEOUT,应用生命周期处理超时故障。

3 问题原因

3.1正常机制

camera快速打开以及关闭测试过程中,相机功能正常,不会上报生命周期超时类的appfreeze故障

3.2异常场景

camera快速打开以及关闭测试过程中,一旦camera_host适配层启动的线程,还没有执行到底层库的mmap函数时,就收到了相机设备关闭命令,线程快速退出了。此时camera设备关闭过程中,底层mmap函数和munmap函数都没有机会执行,对应的相机设备打开时申请的3个ION内存就没有释放,会造成ION内存泄漏,ION泄漏到一定的程度后,相机申请不到ion内存,camera_host不在响应应用的操作请求。

4 解决方案

解决内存泄漏问题

在底层库的关闭函数中对底层库申请的ION内存进行检查,如果发现ION内存没有释放,进行ion的释放操作。

int ***V4l2AdapterImpl::close(int fd) {
  ......
  /*---start---新增代码如下:对ION内存进行检测并释放---start---*/
  int tmp = mPreviewHeapNum;
  for (int i = 0; i < tmp; i++) {
    if (mFullPathDataHeap[i]) {
      if (mFullPathDataHeap[i]->ion_heap) {
        delete mFullPathDataHeap[i]->ion_heap;
        mFullPathDataHeap[i]->ion_heap = NULL;
      }
      free(mFullPathDataHeap[i]);
      mFullPathDataHeap[i] = NULL;
      mPreviewHeapNum--;
    }
  }
  /*---end---新增代码如上:对ION内存进行检测并释放---end---*/
  ......
  return ret;
}

5 定位过程

1、查看故障日志,获取故障基本信息

 故障类型:APP_LIFECYCLE_TIMEOUT

故障信息:Terminate Application TimeOut!(应用terminate生命周期方法10S没有执行完成)

故障时间:2023/06/18-09:04:29:769

故障应用:com.ohos.camera

故障应用进程号:16387

故障应用主进程堆栈:由libcamera_framework.z.so 发起IPC通信

 2、查看故障日志中binder调用链,确定是否存在binder等待的情况

 故障应用binder调用链:主进程16387在等待进程788的8902线程返回,788的8902线程又在等待626的718线程返回,等待时间10秒多

 3、hilog日志中搜索故障应用主进程日志,确定是否阻塞

 故障应用在06-18 09:04:19.769 开始releaseSession,然后主进程打印结束,直到上报Terminate超时故障。

 综合上述主进程堆栈,binder调用链,hilog日志可以确定导致该appfreeze故障的直接根因为binder对端788(camera_service)未返回,而camera_service未返回的根因为626(camera_host)未返回。后续转给责任田camera_host继续分析。

4、后续由camera_host接力分析,详情见:https://laval.csdn.net/64eff52c2ea0282871eac448.html

6 知识分享

appfreeze故障检测原理和分析流程:OpenHarmony_appfreeze检测原理及分析方法流程_zhengxiaobo131202-LAVAL社区 (csdn.net)

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐