完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1.主题Tina Linux 网络ADB内存泄露修复 2.问题背景硬件:V853 3.问题描述3.1复现步骤1、首先使能网络ADB功能。
2、连接无线网络,保持小机与测试电脑处于同一个局域网中。 3、编写bat脚本,进行压测。
4、使用内存泄露工具查看内存是否泄露。 3.2具体表现使用内部一款内存泄露工具观察adbd工具内存占用情况:
发现确实存在内存泄露的情况。 4.问题分析使能网络adb时,将命令改成:
将adbd的log信息输出到控制台上,观察adbd的运行情况。 根据log信息以及对比源码能够发现,在调用transport.c的transport_registration_func()函数时,当读到的action等于0,即退出adb时,就会free掉一些之前malloc的指针。 5.根本原因通过在函数transport_registration_func()的free动作前后添加打印能够发现,在adb disconnect时,并没有调用到free的动作。 再在register_socket_transport()中calloc结构体atransport前后添加打印发现,每次adb connect时,都会重新调用register_socket_transport()去注册传输所需要的资源,并且会重新申请一篇内存。 那么就根据前后,就能知道在disconnect时有一篇内存没有释放,而后重新connect时又新申请内存,导致了内存的泄露。 对比有线adb,在连接时会申请结构体atransport的内存,在拔出usb线时也会free掉对应的内存。 再看回来函数transport_registration_func(), 在初始化时,这里注册了一个异步事情回调函数,当接收到事件的时候,就会调用transport_registration_func()去处理事件。对于拔出USB线来说,就会对gadget进行disconnect,然后composite gadget就会通过uevent通知应用层已经断开连接了,于是adbd就能够获取到事件从而去断开连接,释放资源。 而对于网络adb来说,暂无这种机制。所以就需要依靠在output_thread中,在通信失败后主动触发断连的操作。 在部分SDK中,存在这么一个补丁:
补丁的作用时,当通信失败时,就会断连、释放资源。这个补丁引入是为了修复USB ADB在通信不佳的情况下,触发了通信失败然后导致了USB重新枚举。 6.解决办法基于上述情况,在output_thread中加入限制的条件。在USB ADB时,取消break,让其一直在循环当中。对于网络ADB来说,则是执行break,当发生断连时,能够及时将资源释放掉。 修复的补丁如附件所示。 0001-adbd-only-transport_local-can-disconnect-in-outputth.patch |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【实测】用全志A733平板搭建一个端侧Deepseek算力平台
561 浏览 0 评论
1200 浏览 0 评论
805 浏览 0 评论
944 浏览 0 评论
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发
1643 浏览 0 评论
全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
99372浏览 3评论
2934浏览 1评论
Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程
16529浏览 1评论
关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案
1230浏览 1评论
泰酷辣!基于全志R818的开源超迷你安卓手持终端CyberPad,芒果派惊喜之作
3392浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-5 10:09 , Processed in 0.653351 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191