全志平台Android 系统调试方法(1)系统内存调试

以下技术在盈鹏飞嵌入式的A40I/T3核心板(CoM-X40I)和主控板(SBC-X40I)上经过验证,欢迎 交流! CoM-X40I核心板和SBC-X40I主板见下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 前言

总结Android调试过程中关于系统内存方面的方法

2. 内存调试


   
   
  1. Adb shell dumpsys procstats --hours X
  2. adb remount
  3. adb push cpu_monitor / system/xbin/cpu_monitor
  4. adb shell chmod 777 / system/xbin/cpu_monitor

测试游戏前后所需要记录的准确数据:

(1)cpu_monitor -u 1 -m 500

记录下以下红色框中的Anon、slab、 cache 、sysfre、cmafre数据

(2)/sys/kernel/debug/ion/cma free 和busy数据

(3)0procmem {target game process pid} | grep /dev/pvrsrvkm

统计下面红色框内pvrsrvkm 内存total使用

3. 内存泄露

(1)Android Native 内存泄露

  • Android DDMS Native heap debug
  • Android Valgrind debug
  • Android AddressScanitizer debug

(2)Linux kernel内存泄露

Slab内存分布调试

CONFIG_DEBUG_SLAB=y

CONFIG_DEBUG_SLAB_LEAK=y

CONFIG_SLABINFO=y


   
   
  1. adb shell echo 1 > /sys/kernel /debug/tracing /tracing_enabled
  2. adb shell echo 1 > /sys /kernel/debug /tracing/tracing_on
  3. adb shell echo > /sys/kernel /debug/tracing /trace
  4. adb shell echo > /sys /kernel/debug /tracing/set_event
  5. adb shell echo kfree kmalloc kmalloc_node kmem_cache_alloc kmem_cache_alloc_node kmem_cache_free >> /sys/kernel /debug/tracing /set_event
  6. adb shell cat /sys /kernel/debug /tracing/trace_pipe > /data/trace.log

(3)ION内存泄露

cat /sys/kernel/debug/ion/heaps/cma

lsof | grep /dev/ion

lsof | grep dmabuf

showmem {可疑目标进程$PID}| grep dmabuf

4. 内存溢出

Armv8 64bit平台内核内核线程栈配置:

默认16K,可调整;

栈底溢出检查 配置:

CONFIG_STACK_TRACER=y


   
   
  1. # mount -t debugfs none /sys/kernel/debug
  2. # echo 1 > /proc/sys/kernel/stack_tracer_enabled
  3. # cd /sys/kernel/debug/tracing/
  4. # cat stack_max_size
  5. # cat stack_trace

定期对stack_max_size 和 stack_trace进行采样,观察栈增长的可疑点

栈顶溢出检查 配置:CONFIG_CC_STACKPROTECTOR=y

栈顶越界,gcc提供了支持。

打开内核配置CONFIG_CC_STACKPROTECTOR后,会打开编译选项-fstack-protector.

栈顶溢出检查原理是:

      在进程启动的时候, 栈顶后面放置一个预先设置好的stack canary(哨兵),

      当栈发生溢出的时候会破坏stack canary的值, 当stack canary的值被破坏的时候,

      内核就会直接触发panic。

静态代码编译检查 配置:CONFIG_FRAME_WARN=2048

查看编译时是否有编译警告:

warning: the frame size of xxx bytes is larger then 2048 bytes [-Wframe-larger-than=]

如果有可疑的栈溢出死机,可以再适当调小WARN值,排查较大栈使用模块;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值