|
发表于 2020-9-27 14:08:28
6688 浏览 0 回复
MT6582/6572/6570如何开启fdleak调试功能
[DESCRIPTION]
fdleak 顾名思义就是File Descriptors 泄漏,即操作完File后,没有回收File Descriptors,从而导致File Descriptors被耗尽。即类似于memory leak。
[SOLUTION]
1.fdleak调试功能仅在eng版本中支持,所以务必用eng版本进行设置和debug。
O版本以后userdebug/eng 都可以打开。
2.另外KK及以前的版本
在调试前请确认当前的codebase中包含alps/out/target/product/$(project)/system/lib/libc_fdleak_debug_mtk.so,如果没有,请通过eService向MTK获取。
L及之后的版本则不需要。
3.如何打开fdleak 调试? 请依照以下两步骤
O之前版本
步骤a:
- 在vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.rc添加:
- on init
- export LD_PRELOAD libudf.so:libdirect-coredump.so
- setprop ro.aee.enforcing no
复制代码 注意:
- 如果存在libsigchain.so, 那么libudf.so添加在它后面;
- 如果不存在libsigchain.so, 那么libudf.so放在最前面(原本存在的so,位置都在它后面)。
步骤b:
用adb输入:
- adb shell setprop persist.debug.fdleak 1
- adb shell setprop persist.debug.fdleak.program xxx
- (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).
- 其他进程则以ps 命令显示的名称为准)
- adb reboot
复制代码
P版本
步骤a:
a-1.在/vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.system.rc添加:
- on init
- export LD_PRELOAD libudf.so:libdirect-coredump.so
复制代码 a-2.在/vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.vendor.rc添加:
- on init
- setprop ro.vendor.aee.enforcing no
- a-3.mask userdebug_or_eng in device/mediatek/sepolicy/basic/non_plat/init.te
- 44#userdebug_or_eng(`
- 45 allow init { domain -lmkd -crash_dump }:process noatsecure;
- 46#')
- a-4.mask userdebug_or_eng in device/mediatek/sepolicy/bsp/non_plat/installd.te
- 41#userdebug_or_eng(`
- 42 allow installd dex2oat:process noatsecure;
- 43#')
复制代码
步骤b:
用adb输入:
- adb shell setprop persist.vendor.debug.fdleak 1
- adb shell setprop persist.vendor.debug.fdleak.program xxx
- (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).
- 其他进程则以ps 命令显示的名称为准)
- adb reboot
复制代码
R版本
步骤a:
R上google的限制,不能按照之前版本通过LD_PRELOAD的方式让每个进程默认加载libudf.so了。
所以R版本如果要使用该机制,需要各个模块在各自对应的mk/bp file 中将libudf.so 作为sharelibary,必须加到第一位才可以。(因为FDleak 要hook open 等fd 对应函数,如果后加载的话,就会使用默认libc库中的open等函数)。
比如调试surfaceflinger,则在其的Android.bp中添加的:
步骤b(这步骤也是从Q版本开始调整):
- 用adb输入:
- adb shell setprop persist.vendor.debug.fdleak 1
- adb shell setprop persist.vendor.debug.fdleak.program xxx (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).其他进程则以ps 命令显示的名称为准)
- adb shell setprop persist.vendor.debug.fdleak.bt2log xxx (xxx表示是否要将trace打印到log中)
- adb shell setprop persist.vendor.debug.fdleak.thd xxx (xxx表示要开始记录的fd的值,比如想从fd=100开始记录,这里则设置为100,不设置则默认为1024)
- adb shell setprop persist.vendor.debug.fdleak.watermark xxx (xxx表示要记录截止的最大fd的值,超过也将直接abort,比如想fd超过2000时就abort,这里则设置为2000,默认值为4080)
- adb reboot
复制代码
之后手机重启,并进入fdleak的调试方式。
测试前,请注意保留out/target/product/$project/symbols 目录。
问题复现后,请用GAT(和flashtool一起释放,并且在DCC上有说明文档)的bugreport功能抓取异常Log,然后提交log到eService上,以供MTK进一步分析。
|
|
手机微信同号:13682654092
|
|
|
|
|
登录或注册
|