使用valgrind检测Android native程序的内存

使用valgrind检测Android native程序的内存

分类: Android系统架构   6087人阅读  评论(7)  收藏  举报
android allocation leak delete command system

下载http://valgrind.org/downloads/valgrind-3.7.0.tar.bz2,使用ndk toolchain,按照代码中的README.android编译Android版本的valgrind,push到/data分区,这里笔者push到了/data/local/valgrind/,同时把VALGRIND_LIB 环境变量设置为/data/local/valgrind/lib/valgrind

编写一个有很多内存错误的程序:

[cpp]  view plain copy
  1. main()  
  2. {  
  3.         {     
  4.                 int x;  
  5.                 printf ("x = %d\n", x);   
  6.         }     
  7.         {     
  8.                 char* arr  = malloc(10);  
  9.                 int*  arr2 = malloc(sizeof(int));  
  10.                 write( 1 /* stdout */, arr, 10 );  
  11.         }     
  12.         {     
  13.                 char a[100];  
  14.                 memcpy(a, a + 20, 40);  
  15.         }     
  16.         {     
  17.                 char *q;   
  18.                 q = malloc(1024*1024);  
  19.   
  20.                 q[1] = 1024;  
  21.         }     
  22.         {     
  23.                 char *p;   
  24.                 p = malloc(1024*1024);  
  25.   
  26.                 p[0] = p[0];  
  27.                 p[1] = 1024;  
  28.   
  29.                 free(p);  
  30.                 free(p);  
  31.         }     
  32. }  

使用valgrind运行之:

[cpp]  view plain copy
  1. /data/local/valgrind/bin/valgrind --leak-check=full --track-origins=yes  /data/check  


得到如下结果:

[cpp]  view plain copy
  1. ==965== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.  
  2. ==965== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info  
  3. ==965== Command: /data/check  
  4. ==965==   
  5. ==965== Conditional jump or move depends on uninitialised value(s)  
  6. ==965==    at 0xAFD1AF6A: vfprintf (in /system/lib/libc.so)  
  7. ==965==  Uninitialised value was created by a stack allocation  
  8. ==965==    at 0x83D8: main (check.c:2)  
  9. ==965==   
  10. ==965== Conditional jump or move depends on uninitialised value(s)  
  11. ==965==    at 0xAFD1B3FA: vfprintf (in /system/lib/libc.so)  
  12. ==965==  Uninitialised value was created by a stack allocation  
  13. ==965==    at 0x83D8: main (check.c:2)  
  14. ==965==   
  15. ==965== Conditional jump or move depends on uninitialised value(s)  
  16. ==965==    at 0xAFD1B3FE: vfprintf (in /system/lib/libc.so)  
  17. ==965==  Uninitialised value was created by a stack allocation  
  18. ==965==    at 0x83D8: main (check.c:2)  
  19. ==965==   
  20. ==965== Conditional jump or move depends on uninitialised value(s)  
  21. ==965==    at 0xAFD1B478: vfprintf (in /system/lib/libc.so)  
  22. ==965==  Uninitialised value was created by a stack allocation  
  23. ==965==    at 0x83D8: main (check.c:2)  
  24. ==965==   
  25. ==965== Conditional jump or move depends on uninitialised value(s)  
  26. ==965==    at 0xAFD1B47E: vfprintf (in /system/lib/libc.so)  
  27. ==965==  Uninitialised value was created by a stack allocation  
  28. ==965==    at 0x83D8: main (check.c:2)  
  29. ==965==   
  30. ==965== Conditional jump or move depends on uninitialised value(s)  
  31. ==965==    at 0xAFD0FE00: __udivdi3 (in /system/lib/libc.so)  
  32. ==965==  Uninitialised value was created by a stack allocation  
  33. ==965==    at 0x83D8: main (check.c:2)  
  34. ==965==   
  35. ==965== Conditional jump or move depends on uninitialised value(s)  
  36. ==965==    at 0xAFD0D230: __udivsi3 (in /system/lib/libc.so)  
  37. ==965==  Uninitialised value was created by a stack allocation  
  38. ==965==    at 0x83D8: main (check.c:2)  
  39. ==965==   
  40. ==965== Conditional jump or move depends on uninitialised value(s)  
  41. ==965==    at 0xAFD0D294: __udivsi3 (in /system/lib/libc.so)  
  42. ==965==  Uninitialised value was created by a stack allocation  
  43. ==965==    at 0x83D8: main (check.c:2)  
  44. ==965==   
  45. ==965== Conditional jump or move depends on uninitialised value(s)  
  46. ==965==    at 0xAFD0FE5C: __udivdi3 (in /system/lib/libc.so)  
  47. ==965==  Uninitialised value was created by a stack allocation  
  48. ==965==    at 0x83D8: main (check.c:2)  
  49. ==965==   
  50. ==965== Conditional jump or move depends on uninitialised value(s)  
  51. ==965==    at 0xAFD0FEAC: __udivdi3 (in /system/lib/libc.so)  
  52. ==965==  Uninitialised value was created by a stack allocation  
  53. ==965==    at 0x83D8: main (check.c:2)  
  54. ==965==   
  55. ==965== Syscall param write(buf) points to uninitialised byte(s)  
  56. ==965==    at 0xAFD0B47C: write (in /system/lib/libc.so)  
  57. ==965==  Address 0x480a058 is 0 bytes inside a block of size 10 alloc'd  
  58. ==965==    at 0x80103318: malloc (vg_replace_malloc.c:263)  
  59. ==965==    by 0x83F7: main (check.c:8)  
  60. ==965==  Uninitialised value was created by a heap allocation  
  61. ==965==    at 0x80103318: malloc (vg_replace_malloc.c:263)  
  62. ==965==    by 0x83F7: main (check.c:8)  
  63. ==965==   
  64. ==965== Source and destination overlap in memcpy(0xbde6b908, 0xbde6b91c, 40)  
  65. ==965==    at 0x80106A64: memcpy (mc_replace_strmem.c:838)  
  66. ==965==    by 0x843B: main (check.c:14)  
  67. ==965==   
  68. ==965== Invalid free() / delete / delete[] / realloc()  
  69. ==965==    at 0x80102E1C: free (vg_replace_malloc.c:427)  
  70. ==965==    by 0x849B: main (check.c:30)  
  71. ==965==  Address 0x490a100 is 0 bytes inside a block of size 1,048,576 free'd  
  72. ==965==    at 0x80102E1C: free (vg_replace_malloc.c:427)  
  73. ==965==    by 0x8493: main (check.c:29)  
  74. ==965==   
  75. ==965==   
  76. ==965== HEAP SUMMARY:  
  77. ==965==     in use at exit: 1,052,686 bytes in 4 blocks  
  78. ==965==   total heap usage: 5 allocs, 2 frees, 2,101,262 bytes allocated  
  79. ==965==   
  80. ==965== 4 bytes in 1 blocks are definitely lost in loss record 1 of 4  
  81. ==965==    at 0x80103318: malloc (vg_replace_malloc.c:263)  
  82. ==965==    by 0x8407: main (check.c:9)  
  83. ==965==   
  84. ==965== 10 bytes in 1 blocks are definitely lost in loss record 2 of 4  
  85. ==965==    at 0x80103318: malloc (vg_replace_malloc.c:263)  
  86. ==965==    by 0x83F7: main (check.c:8)  
  87. ==965==   
  88. ==965== 1,048,576 bytes in 1 blocks are definitely lost in loss record 4 of 4  
  89. ==965==    at 0x80103318: malloc (vg_replace_malloc.c:263)  
  90. ==965==    by 0x8443: main (check.c:18)  
  91. ==965==   
  92. ==965== LEAK SUMMARY:  
  93. ==965==    definitely lost: 1,048,590 bytes in 3 blocks  
  94. ==965==    indirectly lost: 0 bytes in 0 blocks  
  95. ==965==      possibly lost: 0 bytes in 0 blocks  
  96. ==965==    still reachable: 4,096 bytes in 1 blocks  
  97. ==965==         suppressed: 0 bytes in 0 blocks  
  98. ==965== Reachable blocks (those to which a pointer was found) are not shown.  
  99. ==965== To see them, rerun with: --leak-check=full --show-reachable=yes  
  100. ==965==   
  101. ==965== For counts of detected and suppressed errors, rerun with: -v  
  102. ==965== ERROR SUMMARY: 275 errors from 16 contexts (suppressed: 0 from 0)  

这些错误可以分为如下几类:

  1. Illegal read / Illegal write errors
  2. Use of uninitialised values
  3. Use of uninitialised or unaddressable values in system calls
  4. Illegal frees
  5. When a heap block is freed with an inappropriate deallocation function
  6. Overlapping source and destination blocks
  7. Memory leak detection

你可能感兴趣的:(Android系统架构)