以下技术在盈鹏飞嵌入式的A40I/T3核心板(CoM-X40I)和主控板(SBC-X40I)上经过验证,欢迎 交流! CoM-X40I核心板和SBC-X40I主板见下图:
1. 前言
总结Android调试过程中关于系统内存方面的方法
2. 内存调试
-
Adb shell dumpsys procstats --hours X
-
-
adb remount
-
-
adb
push cpu_monitor /
system/xbin/cpu_monitor
-
-
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
-
adb shell echo
1 >
/sys/kernel
/debug/tracing
/tracing_enabled
-
-
adb shell echo 1 > /sys
/kernel/debug
/tracing/tracing_on
-
-
adb shell echo >
/sys/kernel
/debug/tracing
/trace
-
-
adb shell echo > /sys
/kernel/debug
/tracing/set_event
-
-
adb shell echo kfree kmalloc kmalloc_node kmem_cache_alloc kmem_cache_alloc_node kmem_cache_free >>
/sys/kernel
/debug/tracing
/set_event
-
-
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
-
# mount -t debugfs none /sys/kernel/debug
-
# echo 1 > /proc/sys/kernel/stack_tracer_enabled
-
# cd /sys/kernel/debug/tracing/
-
# cat stack_max_size
-
# 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值,排查较大栈使用模块;