记一次GL error: Out of memory!的崩溃

2023-05-16

现象描述:

设备外接UVC摄像头,使用uvccamera库去打开,在进行打开->关闭压测的过程中,发现到了940多次进程就崩溃,大致log如下:

2020-05-04 17:23:52.983 8657-8684/com.xx.xx E/Parcel: dup() failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
2020-05-04 17:23:52.983 8657-8684/com.xx.xx E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22
2020-05-04 17:23:52.984 8657-8684/com.xx.xx E/mali_so: encounter the first mali_error : 0x0002 : failed to allocate CPU memory (gles_fb_first_drawcall_cb at hardware/arm/mali_so_src_of_midgard/driver/product/gles/src/fb/mali_gles_fb_module_api.c:961)
2020-05-04 17:23:52.985 8657-8684/com.xx.xx E/OpenGLRenderer: GL error:  Out of memory!
2020-05-04 17:23:52.985 8657-8684/com.xx.xx A/OpenGLRenderer: GL errors! frameworks/base/libs/hwui/renderthread/CanvasContext.cpp:550
    
    --------- beginning of crash
2020-05-04 17:23:52.986 8657-8684/com.xx.xx A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 8684 (RenderThread)
2020-05-04 17:23:53.089 20578-20578/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-05-04 17:23:53.089 20578-20578/? A/DEBUG: Build fingerprint: 'xx/xx/xx:7.1.2/NHG47K/41:user/release-keys'
2020-05-04 17:23:53.089 20578-20578/? A/DEBUG: Revision: '0'
2020-05-04 17:23:53.089 20578-20578/? A/DEBUG: ABI: 'arm64'
2020-05-04 17:23:53.090 20578-20578/? A/DEBUG: pid: 8657, tid: 8684, name: RenderThread  >>> com.xx.xx <<<
2020-05-04 17:23:53.090 20578-20578/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2020-05-04 17:23:53.101 20578-20578/? A/DEBUG: Abort message: 'GL errors! frameworks/base/libs/hwui/renderthread/CanvasContext.cpp:550'
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x0   0000000000000000  x1   00000000000021ec  x2   0000000000000006  x3   0000000000000008
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x4   00006e6174736e69  x5   0000000000000000  x6   0000007c2158f000  x7   0000000000ad38f8
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x8   0000000000000083  x9   ffffffffffffffdf  x10  0000000000000000  x11  0000000000000001
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x12  0000000000000018  x13  000000005eafdf28  x14  003aa793d8b06ae8  x15  00001b0e452dab8b
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x16  0000007c1ed2aee0  x17  0000007c1ecd4b38  x18  0000000000000000  x19  0000007c142824f8
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x20  0000000000000006  x21  0000007c14282450  x22  0000000000000018  x23  0000007c14281c90
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x24  0000007c1f73a34c  x25  0000007c1f73a040  x26  0000000000000001  x27  0000007bdcc11920
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     x28  0000007c115cd270  x29  0000007c14281710  x30  0000007c1ecd1f64
2020-05-04 17:23:53.102 20578-20578/? A/DEBUG:     sp   0000007c142816f0  pc   0000007c1ecd4b40  pstate 0000000060000000
2020-05-04 17:23:53.121 20578-20578/? A/DEBUG: backtrace:
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #00 pc 000000000006bb40  /system/lib64/libc.so (tgkill+8)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #01 pc 0000000000068f60  /system/lib64/libc.so (pthread_kill+64)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #02 pc 0000000000023f58  /system/lib64/libc.so (raise+24)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #03 pc 000000000001c810  /system/lib64/libc.so (abort+52)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #04 pc 0000000000010d10  /system/lib64/libcutils.so (__android_log_assert+224)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #05 pc 0000000000032b28  /system/lib64/libhwui.so
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #06 pc 0000000000035260  /system/lib64/libhwui.so
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #07 pc 000000000003ab30  /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread10threadLoopEv+152)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #08 pc 00000000000124b4  /system/lib64/libutils.so (_ZN7android6Thread11_threadLoopEPv+272)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #09 pc 000000000009f210  /system/lib64/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+116)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #10 pc 0000000000068748  /system/lib64/libc.so (_ZL15__pthread_startPv+208)
2020-05-04 17:23:53.122 20578-20578/? A/DEBUG:     #11 pc 000000000001da7c  /system/lib64/libc.so (__start_thread+16)
2020-05-04 17:23:54.607 600-20582/? W/ActivityManager:   Force finishing activity com.sensetime.demo/.ui.MainActivity
解决思路

粗略一看,感觉好像与renderthread有关,毕竟是直接现场;再一看,好像是内存泄漏了, 毕竟报了Out of memory;然后就去用free、dumpsys meminfo等监测内存的变化,发现就算到了崩溃之前,内存占用也是正常的,奇怪了。

root cause

注意到最上面一行
2020-05-04 17:23:52.983 8657-8684/com.xx.xx E/Parcel: dup() failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files
报了fd的错误,Too many open files,于是可以去看看proc下面具体打开的fd是哪些

ls -la  proc/pid/fd/   

pid换成要监控的进程号,发现每次打开预览都保留了usb下面的fd,关闭的时候却没有释放,导致单进程持有fd超过1024的限制所以崩溃了,也能解释为什么每次都是到940多次的时候崩溃而内存其实并没有异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次GL error: Out of memory!的崩溃 的相关文章

  • 使用数组字段代替大量对象

    鉴于本文 http www simple talk com dotnet net framework object overhead the hidden net memory allocation cost 我想知道人们在内存中使用数组存
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • 除了内存管理之外,QObject 的父对象还用于什么?

    我知道 当一个QObject http doc qt io qt 5 qobject html被摧毁了 它也摧毁了它所有的孩子 但是 在我最近的所有 Qt 代码中 我总是声明任何类的成员 例如 QMainWindow https doc q
  • printf() var-arg 引用如何与堆栈内存布局交互?

    给出代码片段 int main printf Val d 5 return 0 是否有任何保证编译器会存储 Val d and 5 连续地 例如 d l a V 5 Format String
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • boost::serialization 序列化期间内存消耗较高

    正如主题所示 在将大量数据序列化到文件时 我遇到了 boost serialization 的一个小问题 问题在于应用程序序列化部分的内存占用量大约是要序列化的对象内存的 3 到 3 5 倍 值得注意的是 我拥有的数据结构是基类指针和指向该
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 最初从位图泄漏未引用的 byte[] 但被回收()导致内存泄漏(直到活动停止)

    我有位图内存泄漏导致内存不足 我在 Android 5 0 三星 S5 上运行了测试 我已经使用 Android Studio 1 5 1 2 0 0 Preview 7 调查了这个问题 HPROF 内存转储显示有多个 byte 与我暂时使
  • TryXXX 类似带有“out”参数的方法与返回可为空值类型的方法?

    我经常在 C 中看到这样的方法 进行可能会或可能不会给出结果的计算 bool TrySomething SomeType inputData out SomeOtherType result 为什么人们不使用这样的东西呢 Nullable
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • Codeigniter 处理大文件时允许的内存大小耗尽

    我发布此内容是为了防止其他人正在寻找相同的解决方案 因为我刚刚在这个废话上浪费了两天时间 我有一个 cron 作业 每天使用一个非常大的文件更新数据库一次 使用以下代码 if handle fopen dirname FILE uncomp
  • JVM内存段分配

    好吧 我有一个关于 JVM 内存段的问题 我知道每个 JVM 都会选择稍微不同地实现这一点 但这是一个总体概念 在所有 JVM 中应该保持相同 一个在运行时不使用虚拟机执行的标准C C 程序在运行时有四个内存段 代码 堆栈 堆 数据 所有这
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 当结构体包含字符串时为其分配内存

    假设如果我有一个这样的结构 struct node note that i have changed the struct code according to my convenience char lastname char employ
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • 为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?

    Go 不允许获取地图成员的地址 if I do this p mm abc Syntax Error cannot take the address of mm abc 理由是 如果 Go 允许使用此地址 那么当地图后台存储增长或缩小时 该
  • c# 通过内存地址调用方法

    我正在尝试在 C 中的指定内存地址调用函数 以下是我在 C 中的操作方法 typedef void do int i auto doActor do 0xAAAABEEF doActor 1 如果可能的话 如何在 C 中复制这种行为 对 C
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl

随机推荐