首页 > 技术知识 > 正文

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数据

Android 系统调试技巧(1)系统内存调试

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

Android 系统调试技巧(1)系统内存调试1

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

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

Android 系统调试技巧(1)系统内存调试2

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

Android 系统调试技巧(1)系统内存调试3

Android 系统调试技巧(1)系统内存调试4

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

Android 系统调试技巧(1)系统内存调试5

(3)ION内存泄露

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

Android 系统调试技巧(1)系统内存调试6

lsof | grep /dev/ion Android 系统调试技巧(1)系统内存调试7

lsof | grep dmabuf Android 系统调试技巧(1)系统内存调试8

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

Android 系统调试技巧(1)系统内存调试9

4. 内存溢出

Armv8 64bit平台内核内核线程栈配置:默认16K,可调整;

Android 系统调试技巧(1)系统内存调试10

栈底溢出检查 配置: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值,排查较大栈使用模块;

猜你喜欢