Android内存检测

上传人:xy****7 文档编号:45025615 上传时间:2018-06-14 格式:DOC 页数:7 大小:79KB
返回 下载 相关 举报
Android内存检测_第1页
第1页 / 共7页
Android内存检测_第2页
第2页 / 共7页
Android内存检测_第3页
第3页 / 共7页
Android内存检测_第4页
第4页 / 共7页
Android内存检测_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Android内存检测》由会员分享,可在线阅读,更多相关《Android内存检测(7页珍藏版)》请在金锄头文库上搜索。

1、Android 内存检测内存检测1. IntroductionAndroid 对内存的使用包括内存泄漏和内存越界,内存泄漏会导致系统内存减少,最终分配不到内存,这样大的程序就不能运行,甚至系统没有内存而崩溃。Android 中 kernel 和应用程序都可能会有内存泄漏和越界。对于 Java 代码,在越界的时候虚拟机会加以检查并抛出异常。而对于C/C+代码,越界的时候就悄无声息地让程序出错或 crash2. 内核中的内存泄漏检测内核中已经内嵌了内存泄漏的代码,编译的时候需要打开配置代码及帮助位置:其中 kmemcheck 是检测内存越界等错误的,目前只支持 X86kernel/Document

2、ation/kmemleak.txtkernel/Documentation/kmemcheck.txtkernel/mm/kmemleak.ckernel/mm/kmemcheck.c内核配置CONFIG_DEBUG_KMEMLEAK=yCONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=1000其中 CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE 的大小跟 board 的 kernel porting 相关,有的不需要定义,有的需要定义大一点,可以在 kmemleak.c 中模块初始化代码中调试.kmemleak 模块初始化成功后,会产生/s

3、ys/kernel/debug/kmemleak 这个文件操作命令如下:#su#echo scan /sys/kernel/debug/kmemleak 扫描泄漏#cat /sys/kernel/debug/kmemleak 查看泄漏#echo clear /sys/kernel/debug/kmemleak 清除结果当出现泄漏后,会有提示,比如unreferenced object 0xd25f3cc0 (size 64):comm “Binder_5“, pid 1257, jiffies 68676 (age 3105.280s)hex dump (first 32 bytes):00

4、00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 .00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .backtrace: create_object+0x12c/0x248 kmemleak_alloc+0x88/0xcc kmem_cache_alloc_trace+0x13c/0x1f4 ion_carveout_heap_map_dma+0x34/0xcc ion_alloc+0x170/0x3f0 ion_ioctl+0xc0/0x410 do_vfs_ioctl+0x4f4/0x568 sys_

5、ioctl+0x48/0x6c ret_fast_syscall+0x0/0x48 0xffffffff通过 backtrace 可以看到泄漏的地方是 ion_carveout_heap_map_dma,通过看代码发现是ion_carveout_heap_unmap_dma 的时候少释放了内存。kmemleak 的原理这里不作介绍,大致原理扫描是否有指针指向这段内存,没有则认为是泄漏,这也导致有的地方会误报,比如内存重复使用带引用次数的,int offset = 4;char *real = kmalloc(size, flag) + offsetkfree(real - offset)在内核

6、中这种特殊的地方很少,大部分检测出来的都是真的泄漏了。3. 内核中的内存越界检测参考: kernel/Documentation/vm/slub.txt内核配置为使用 slub 作为内存分配器,slub 本身提供了检查越界的接口,如果 kernel 刚启动就要检查内存破坏,则需要编译的时候配置CONFIG_SLUB_DEBUG_ON=y否则可以使用 slabinfo d A 来打开检查功能,打开后,slub 会在内存后面加一些关键字,释放的时候会检查是否被破坏,如果破坏了,check_bytes_and_report 中 print 一个警告,可以修改 check_bytes_and_repo

7、rt 后面部分的代码,在 debug 版本中加入 panic 让系统死机来报告内存越界错误。static int check_bytes_and_report(struct kmem_cache *s, struct page *page,u8 *object, char *what,u8 *start, unsigned int value, unsigned int bytes)u8 *fault;u8 *end;fault = memchr_inv(start, value, bytes);if (!fault)return 1;end = start + bytes;while (en

8、d fault slab_bug(s, “%s overwritten“, what);printk(KERN_WARN “INFO: 0x%p-0x%p. First byte 0x%x instead of 0x%xn“,fault, end - 1, fault0, value);print_trailer(s, page, object);restore_bytes(s, what, value, fault, end);return 0;比如显示如下:BUG kmalloc-8: Redzone overwritten-INFO: 0xc90f6d28-0xc90f6d2b. Fir

9、st byte 0x00 instead of 0xcc INFO: Slab 0xc528c530 flags=0x400000c3 inuse=61 fp=0xc90f6d58 INFO: Object 0xc90f6d20 offset=3360 fp=0xc90f6d58 INFO: Allocated in get_modalias+0x61/0xf5 age=53 cpu=1 pid=554Bytes b4 0xc90f6d10: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a .ZZZZZZZZ Object 0xc90f6d20:

10、 31 30 31 39 2e 30 30 35 1019.005 Redzone 0xc90f6d28: 00 cc cc cc . Padding 0xc90f6d50: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ dump_trace+0x63/0x1eb show_trace_log_lvl+0x1a/0x2f show_trace+0x12/0x14 dump_stack+0x16/0x18 object_err+0x143/0x14b check_object+0x66/0x234 _slab_free+0x239/0x384 kfree+0xa6/0xc6

11、get_modalias+0xb9/0xf5 dmi_dev_uevent+0x27/0x3c dev_uevent+0x1ad/0x1da kobject_uevent_env+0x20a/0x45b kobject_uevent+0xa/0xf store_uevent+0x4f/0x58 dev_attr_store+0x29/0x2f sysfs_write_file+0x16e/0x19c vfs_write+0xd1/0x15a sys_write+0x3d/0x72 sysenter_past_esp+0x5f/0x99 0xb7f7b4104. 应用的内存简介4.1. 查看系统

12、内存可以使用 ddms 来查看系统的内存使用情况,是靠读取/proc/meminfo 来分析出来的框图。4.2. 进程内存查看单个进程的内存使用情况可以检查 proc/status再具体可以看/proc/statm/proc/maps/proc/smapstop 命令也可以显示 VSS 和 RSSVSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)USS - Unique Se

13、t Size 进程独自占用的物理内存(不包含共享库占用的内存一般来说内存占用大小有如下规律:VSS = RSS = PSS = USS# procrank -hUsage: procrank -W -v | -r | -p | -u | -h -v Sort by VSS.-r Sort by RSS.-p Sort by PSS.-u Sort by USS.(Default sort order is PSS.)-R Reverse sort order (default is descending).-w Display statistics for working set only.-

14、W Reset working set of all processes.-h Display this help screen.And here is some sample output:# procrankPID Vss Rss Pss Uss cmdline1217 36848K 35648K 17983K 13956K system_server1276 32200K 32200K 14048K 10116K android.process.acore1189 26920K 26920K 9293K 5500K zygote1321 20328K 20328K 4743K 2344K

15、 android.process.media1356 20360K 20360K 4621K 2148K com.android.email1303 20184K 20184K 4381K 1724K com.android.settings1271 19888K 19888K 4297K 1764K com.android.inputmethod.latin1332 19560K 19560K 3993K 1620K com.android.alarmclock1187 5068K 5068K 2119K 1476K /system/bin/mediaserver1384 436K 436K 248K 236K procrank1 212K 212K 200K 200K /i

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号