搜索

430

主题

515

帖子

2134

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2134
QQ
发表于 2020-9-27 14:08:28 6687 浏览 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
  1.   在vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.rc添加:
  2.   on init
  3.   export LD_PRELOAD libudf.so:libdirect-coredump.so
  4.   setprop ro.aee.enforcing no
复制代码
注意:
    - 如果存在libsigchain.so, 那么libudf.so添加在它后面;
    - 如果不存在libsigchain.so, 那么libudf.so放在最前面(原本存在的so,位置都在它后面)。
步骤b:
  用adb输入:
  1.   adb shell setprop persist.debug.fdleak 1
  2.   adb shell setprop persist.debug.fdleak.program xxx
  3.     (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).
  4.       其他进程则以ps 命令显示的名称为准)
  5.   adb  reboot
复制代码


P版本
步骤a:

  a-1.在/vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.system.rc添加:
  1.   on init
  2.   export LD_PRELOAD libudf.so:libdirect-coredump.so
复制代码
a-2.在/vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.vendor.rc添加:
  1.   on init
  2.   setprop ro.vendor.aee.enforcing no
  3.   a-3.mask userdebug_or_eng in device/mediatek/sepolicy/basic/non_plat/init.te
  4.   44#userdebug_or_eng(`
  5.   45 allow init { domain -lmkd -crash_dump }:process noatsecure;
  6.   46#')

  7.   a-4.mask userdebug_or_eng in device/mediatek/sepolicy/bsp/non_plat/installd.te
  8.   41#userdebug_or_eng(`
  9.   42 allow installd dex2oat:process noatsecure;
  10.   43#')
复制代码


步骤b:
  用adb输入:
  1.   adb shell setprop persist.vendor.debug.fdleak 1
  2.   adb shell setprop persist.vendor.debug.fdleak.program xxx
  3.     (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).
  4.       其他进程则以ps 命令显示的名称为准)
  5.   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版本开始调整):
  1. 用adb输入:
  2. adb shell setprop persist.vendor.debug.fdleak 1
  3. adb shell setprop persist.vendor.debug.fdleak.program xxx (xxx为被监控进程名称,如果是system_server或者java程序,都必须统一填app_process (或app_process64).其他进程则以ps 命令显示的名称为准)
  4. adb shell setprop persist.vendor.debug.fdleak.bt2log xxx (xxx表示是否要将trace打印到log中)
  5. adb shell setprop persist.vendor.debug.fdleak.thd xxx (xxx表示要开始记录的fd的值,比如想从fd=100开始记录,这里则设置为100,不设置则默认为1024)
  6. adb shell setprop persist.vendor.debug.fdleak.watermark xxx (xxx表示要记录截止的最大fd的值,超过也将直接abort,比如想fd超过2000时就abort,这里则设置为2000,默认值为4080)
  7. adb  reboot
复制代码

之后手机重启,并进入fdleak的调试方式。
测试前,请注意保留out/target/product/$project/symbols 目录。
问题复现后,请用GAT(和flashtool一起释放,并且在DCC上有说明文档)的bugreport功能抓取异常Log,然后提交log到eService上,以供MTK进一步分析。
手机微信同号:13682654092
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表