Home | History | Annotate | only in /bionic/libc/malloc_debug
Up to higher level directory
NameDateSize
Android.bp21-Aug-20182.7K
backtrace.cpp21-Aug-20185.9K
backtrace.h21-Aug-20181.7K
Config.cpp21-Aug-201819K
Config.h21-Aug-20186.4K
debug_disable.cpp21-Aug-20182.1K
debug_disable.h21-Aug-20182.1K
debug_log.h21-Aug-20182K
DebugData.cpp21-Aug-20182.9K
DebugData.h21-Aug-20183.1K
exported32.map21-Aug-2018524
exported64.map21-Aug-2018487
GuardData.cpp21-Aug-20183.9K
GuardData.h21-Aug-20182.8K
malloc_debug.cpp21-Aug-201823.7K
malloc_debug.h21-Aug-20182.5K
MapData.cpp21-Aug-20184.7K
MapData.h21-Aug-20182.3K
OptionData.h21-Aug-20181.6K
PointerData.cpp21-Aug-201818.5K
PointerData.h21-Aug-20185.5K
README.md21-Aug-201825K
README_api.md21-Aug-20182.5K
README_marshmallow_and_earlier.md21-Aug-20184.5K
RecordData.cpp21-Aug-20187.1K
RecordData.h21-Aug-20184.1K
tests/21-Aug-2018

README.md

      1 Malloc Debug
      2 ============
      3 
      4 Malloc debug is a method of debugging native memory problems. It can help
      5 detect memory corruption, memory leaks, and use after free issues.
      6 
      7 This documentation describes how to enable this feature on Android N or later
      8 versions of the Android OS.
      9 
     10 The documentation for malloc debug on older versions of Android is
     11 [here](README_marshmallow_and_earlier.md).
     12 
     13 In order to enable malloc debug, you must be able to set special system
     14 properties using the setprop command from the shell. This requires the
     15 ability to run as root on the device.
     16 
     17 When malloc debug is enabled, it works by adding a shim layer that replaces
     18 the normal allocation calls. The replaced calls are:
     19 
     20 * `malloc`
     21 * `free`
     22 * `calloc`
     23 * `realloc`
     24 * `posix_memalign`
     25 * `memalign`
     26 * `aligned_alloc`
     27 * `malloc_usable_size`
     28 
     29 On 32 bit systems, these two deprecated functions are also replaced:
     30 
     31 * `pvalloc`
     32 * `valloc`
     33 
     34 Any errors detected by the library are reported in the log.
     35 
     36 NOTE: There is a small behavioral change beginning in P for realloc.
     37 Before, a realloc from one size to a smaller size would not update the
     38 backtrace related to the allocation. Starting in P, every single realloc
     39 call changes the backtrace for the pointer no matter whether the pointer
     40 returned has changed or not.
     41 
     42 
     43 Controlling Malloc Debug Behavior
     44 ---------------------------------
     45 Malloc debug is controlled by individual options. Each option can be enabled
     46 individually, or in a group of other options. Every single option can be
     47 combined with every other option.
     48 
     49 Option Descriptions
     50 -------------------
     51 ### front\_guard[=SIZE\_BYTES]
     52 Enables a small buffer placed before the allocated data. This is an attempt
     53 to find memory corruption occuring to a region before the original allocation.
     54 On first allocation, this front guard is written with a specific pattern (0xaa).
     55 When the allocation is freed, the guard is checked to verify it has not been
     56 modified. If any part of the front guard is modified, an error will be reported
     57 in the log indicating what bytes changed.
     58 
     59 If the backtrace option is also enabled, then any error message will include
     60 the backtrace of the allocation site.
     61 
     62 If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
     63 The default is 32 bytes, the max bytes is 16384. SIZE\_BYTES will be
     64 padded so that it is a multiple of 8 bytes on 32 bit systems and 16 bytes
     65 on 64 bit systems to make sure that the allocation returned is aligned
     66 properly.
     67 
     68 This option adds a special header to all allocations that contains the guard
     69 and information about the original allocation.
     70 
     71 Example error:
     72 
     73     04-10 12:00:45.621  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED FRONT GUARD
     74     04-10 12:00:45.622  7412  7412 E malloc_debug:   allocation[-32] = 0x00 (expected 0xaa)
     75     04-10 12:00:45.622  7412  7412 E malloc_debug:   allocation[-15] = 0x02 (expected 0xaa)
     76 
     77 ### rear\_guard[=SIZE\_BYTES]
     78 Enables a small buffer placed after the allocated data. This is an attempt
     79 to find memory corruption occuring to a region after the original allocation.
     80 On first allocation, this rear guard is written with a specific pattern (0xbb).
     81 When the allocation is freed, the guard is checked to verify it has not been
     82 modified. If any part of the rear guard is modified, an error will be reported
     83 in the log indicating what bytes changed.
     84 
     85 If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
     86 The default is 32 bytes, the max bytes is 16384.
     87 
     88 This option adds a special header to all allocations that contains
     89 information about the original allocation.
     90 
     91 Example error:
     92 
     93     04-10 12:00:45.621  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED REAR GUARD
     94     04-10 12:00:45.622  7412  7412 E malloc_debug:   allocation[130] = 0xbf (expected 0xbb)
     95     04-10 12:00:45.622  7412  7412 E malloc_debug:   allocation[131] = 0x00 (expected 0xbb)
     96 
     97 ### guard[=SIZE\_BYTES]
     98 Enables both a front guard and a rear guard on all allocations.
     99 
    100 If SIZE\_BYTES is present, it indicates the number of bytes in both guards.
    101 The default is 32 bytes, the max bytes is 16384.
    102 
    103 ### backtrace[=MAX\_FRAMES]
    104 Enable capturing the backtrace of each allocation site.
    105 This option will slow down allocations by an order of magnitude. If the
    106 system runs too slowly with this option enabled, decreasing the maximum number
    107 of frames captured will speed the allocations up.
    108 
    109 Note that any backtrace frames that occur within the malloc backtrace library
    110 itself are not recorded.
    111 
    112 If MAX\_FRAMES is present, it indicates the maximum number of frames to
    113 capture in a backtrace. The default is 16 frames, the maximumum value
    114 this can be set to is 256.
    115 
    116 Before P, this option adds a special header to all allocations that contains
    117 the backtrace and information about the original allocation. After that, this
    118 option will not add a special header.
    119 
    120 As of P, this option will also enable dumping backtrace heap data to a
    121 file when the process receives the signal SIGRTMAX - 17 ( which is 47 on most
    122 Android devices). The format of this dumped data is the same format as
    123 that dumped when running am dumpheap -n. The default is to dump this data
    124 to the file /data/local/tmp/backtrace\_heap.**PID**.txt. This is useful when
    125 used with native only executables that run for a while since these processes
    126 are not spawned from a zygote process.
    127 
    128 Note that when the signal is received, the heap is not dumped until the next
    129 malloc/free occurs.
    130 
    131 ### backtrace\_enable\_on\_signal[=MAX\_FRAMES]
    132 Enable capturing the backtrace of each allocation site. If the
    133 backtrace capture is toggled when the process receives the signal
    134 SIGRTMAX - 19 (which is 45 on most Android devices). When this
    135 option is used alone, backtrace capture starts out disabled until the signal
    136 is received. If both this option and the backtrace option are set, then
    137 backtrace capture is enabled until the signal is received.
    138 
    139 If MAX\_FRAMES is present, it indicates the maximum number of frames to
    140 capture in a backtrace. The default is 16 frames, the maximumum value
    141 this can be set to is 256.
    142 
    143 Before P, this option adds a special header to all allocations that contains
    144 the backtrace and information about the original allocation. After that, this
    145 option will not add a special header.
    146 
    147 ### backtrace\_dump\_on\_exit
    148 As of P, when the backtrace option has been enabled, this causes the backtrace
    149 dump heap data to be dumped to a file when the program exits. If the backtrace
    150 option has not been enabled, this does nothing. The default is to dump this
    151 to the file named /data/local/tmp/backtrace\_heap.**PID**.exit.txt.
    152 
    153 The file location can be changed by setting the backtrace\_dump\_prefix
    154 option.
    155 
    156 ### backtrace\_dump\_prefix
    157 As of P, when the backtrace options has been enabled, this sets the prefix
    158 used for dumping files when the signal SIGRTMAX - 17 is received or when
    159 the program exits and backtrace\_dump\_on\_exit is set.
    160 
    161 The default is /data/local/tmp/backtrace\_heap.
    162 
    163 When this value is changed from the default, then the filename chosen
    164 on the signal will be backtrace\_dump\_prefix.**PID**.txt. The filename chosen
    165 when the program exits will be backtrace\_dump\_prefix.**PID**.exit.txt.
    166 
    167 ### fill\_on\_alloc[=MAX\_FILLED\_BYTES]
    168 Any allocation routine, other than calloc, will result in the allocation being
    169 filled with the value 0xeb. When doing a realloc to a larger size, the bytes
    170 above the original usable size will be set to 0xeb.
    171 
    172 If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
    173 of bytes in the allocation. The default is to fill the entire allocation.
    174 
    175 ### fill\_on\_free[=MAX\_FILLED\_BYTES]
    176 When an allocation is freed, fill it with 0xef.
    177 
    178 If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
    179 of bytes in the allocation. The default is to fill the entire allocation.
    180 
    181 ### fill[=MAX\_FILLED\_BYTES]
    182 This enables both the fill\_on\_alloc option and the fill\_on\_free option.
    183 
    184 If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
    185 of bytes in the allocation. The default is to fill the entire allocation.
    186 
    187 ### expand\_alloc[=EXPAND\_BYTES]
    188 Add an extra amount to allocate for every allocation.
    189 
    190 If XX is present, it is the number of bytes to expand the allocation by.
    191 The default is 16 bytes, the max bytes is 16384.
    192 
    193 ### free\_track[=ALLOCATION\_COUNT]
    194 When a pointer is freed, do not free the memory right away, but add it to
    195 a list of freed allocations. In addition to being added to the list, the
    196 entire allocation is filled with the value 0xef, and the backtrace at
    197 the time of the free is recorded. The backtrace recording is completely
    198 separate from the backtrace option, and happens automatically if this
    199 option is enabled. By default, a maximum of 16 frames will be recorded,
    200 but this value can be changed using the free\_track\_backtrace\_num\_frames
    201 option. It can also be completely disabled by setting the option to zero.
    202 See the full description of this option below.
    203 
    204 When the list is full, an allocation is removed from the list and is
    205 checked to make sure that none of the contents have been modified since
    206 being placed on the list. When the program terminates, all of the allocations
    207 left on the list are verified.
    208 
    209 If ALLOCATION\_COUNT is present, it indicates the total number of allocations
    210 in the list. The default is to record 100 freed allocations, the max
    211 allocations to record is 16384.
    212 
    213 Before P, this option adds a special header to all allocations that contains
    214 the backtrace and information about the original allocation. After that, this
    215 option will not add a special header.
    216 
    217 Example error:
    218 
    219     04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE
    220     04-15 12:00:31.305  7412  7412 E malloc_debug:   allocation[20] = 0xaf (expected 0xef)
    221     04-15 12:00:31.305  7412  7412 E malloc_debug:   allocation[99] = 0x12 (expected 0xef)
    222     04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of free:
    223     04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    224     04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    225     04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    226     04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    227 
    228 In addition, there is another type of error message that can occur if
    229 an allocation has a special header applied, and the header is corrupted
    230 before the verification occurs. This is the error message that will be found
    231 in the log:
    232 
    233     04-15 12:00:31.604  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE
    234 
    235 ### free\_track\_backtrace\_num\_frames[=MAX\_FRAMES]
    236 This option only has meaning if free\_track is set. It indicates how many
    237 backtrace frames to capture when an allocation is freed.
    238 
    239 If MAX\_FRAMES is present, it indicates the number of frames to capture.
    240 If the value is set to zero, then no backtrace will be captured when the
    241 allocation is freed. The default is to record 16 frames, the max number of
    242 frames to to record is 256.
    243 
    244 ### leak\_track
    245 Track all live allocations. When the program terminates, all of the live
    246 allocations will be dumped to the log. If the backtrace option was enabled,
    247 then the log will include the backtrace of the leaked allocations. This
    248 option is not useful when enabled globally because a lot of programs do not
    249 free everything before the program terminates.
    250 
    251 Before P, this option adds a special header to all allocations that contains
    252 the backtrace and information about the original allocation. After that, this
    253 option will not add a special header.
    254 
    255 Example leak error found in the log:
    256 
    257     04-15 12:35:33.304  7412  7412 E malloc_debug: +++ APP leaked block of size 100 at 0x2be3b0b0 (leak 1 of 2)
    258     04-15 12:35:33.304  7412  7412 E malloc_debug: Backtrace at time of allocation:
    259     04-15 12:35:33.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    260     04-15 12:35:33.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    261     04-15 12:35:33.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    262     04-15 12:35:33.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    263     04-15 12:35:33.305  7412  7412 E malloc_debug: +++ APP leaked block of size 24 at 0x7be32380 (leak 2 of 2)
    264     04-15 12:35:33.305  7412  7412 E malloc_debug: Backtrace at time of allocation:
    265     04-15 12:35:33.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    266     04-15 12:35:33.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    267     04-15 12:35:33.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    268     04-15 12:35:33.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    269 
    270 ### record\_allocs[=TOTAL\_ENTRIES]
    271 Keep track of every allocation/free made on every thread and dump them
    272 to a file when the signal SIGRTMAX - 18 (which is 46 on most Android devices)
    273 is received.
    274 
    275 If TOTAL\_ENTRIES is set, then it indicates the total number of
    276 allocation/free records that can be retained. If the number of records
    277 reaches the TOTAL\_ENTRIES value, then any further allocations/frees are
    278 not recorded. The default value is 8,000,000 and the maximum value this
    279 can be set to is 50,000,000.
    280 
    281 Once the signal is received, and the current records are written to the
    282 file, all current records are deleted. Any allocations/frees occuring while
    283 the data is being dumped to the file are ignored.
    284 
    285 **NOTE**: This option is not available until the O release of Android.
    286 
    287 The allocation data is written in a human readable format. Every line begins
    288 with the THREAD\_ID returned by gettid(), which is the thread that is making
    289 the allocation/free. If a new thread is created, no special line is added
    290 to the file. However, when a thread completes, a special entry is added to
    291 the file indicating this.
    292 
    293 The thread complete line is:
    294 
    295 **THREAD\_ID**: thread\_done 0x0
    296 
    297 Example:
    298 
    299     187: thread_done 0x0
    300 
    301 Below is how each type of allocation/free call ends up in the file dump.
    302 
    303 pointer = malloc(size)
    304 
    305 **THREAD\_ID**: malloc pointer size
    306 
    307 Example:
    308 
    309     186: malloc 0xb6038060 20
    310 
    311 free(pointer)
    312 
    313 **THREAD\_ID**: free pointer
    314 
    315 Example:
    316 
    317     186: free 0xb6038060
    318 
    319 pointer = calloc(nmemb, size)
    320 
    321 **THREAD\_ID**: calloc pointer nmemb size
    322 
    323 Example:
    324 
    325     186: calloc 0xb609f080 32 4
    326 
    327 new\_pointer = realloc(old\_pointer, size)
    328 
    329 **THREAD\_ID**: realloc new\_pointer old\_pointer size
    330 
    331 Example:
    332 
    333     186: realloc 0xb609f080 0xb603e9a0 12
    334 
    335 pointer = memalign(alignment, size)
    336 
    337 **THREAD\_ID**: memalign pointer alignment size
    338 
    339 pointer = aligned\_alloc(alignment, size)
    340 
    341 **THREAD\_ID**: memalign pointer alignment size
    342 
    343 posix\_memalign(&pointer, alignment, size)
    344 
    345 **THREAD\_ID**: memalign pointer alignment size
    346 
    347 Example:
    348 
    349     186: memalign 0x85423660 16 104
    350 
    351 pointer = valloc(size)
    352 
    353 **THREAD\_ID**: memalign pointer 4096 size
    354 
    355 Example:
    356 
    357     186: memalign 0x85423660 4096 112
    358 
    359 pointer = pvalloc(size)
    360 
    361 **THREAD\_ID**: memalign pointer 4096 <b>SIZE\_ROUNDED\_UP\_TO\_4096</b>
    362 
    363 Example:
    364 
    365     186: memalign 0x85423660 4096 8192
    366 
    367 ### record\_allocs\_file[=FILE\_NAME]
    368 This option only has meaning if record\_allocs is set. It indicates the
    369 file where the recorded allocations will be found.
    370 
    371 If FILE\_NAME is set, then it indicates where the record allocation data
    372 will be placed.
    373 
    374 **NOTE**: This option is not available until the O release of Android.
    375 
    376 ### verify\_pointers
    377 Track all live allocations to determine if a pointer is used that does not
    378 exist. This option is a lightweight way to verify that all
    379 free/malloc\_usable\_size/realloc calls are passed valid pointers.
    380 
    381 Example error:
    382 
    383     04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 UNKNOWN POINTER (free)
    384     04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
    385     04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    386     04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    387     04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    388     04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    389 
    390 Where the name of the function varies depending on the function that called
    391 with a bad pointer. Only three functions do this checking: free,
    392 malloc\_usable\_size, realloc.
    393 
    394 **NOTE**: This option is not available until the P release of Android.
    395 
    396 Additional Errors
    397 -----------------
    398 There are a few other error messages that might appear in the log.
    399 
    400 ### Use After Free
    401     04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (free)
    402     04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace of original free:
    403     04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    404     04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    405     04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    406     04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    407     04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
    408     04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    409     04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    410     04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    411     04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    412 
    413 This indicates that code is attempting to free an already freed pointer. The
    414 name in parenthesis indicates that the application called the function
    415 *free* with the bad pointer.
    416 
    417 For example, this message:
    418 
    419     04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (realloc)
    420 
    421 Would indicate that the application called the *realloc* function
    422 with an already freed pointer.
    423 
    424 ### Invalid Tag
    425     04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS INVALID TAG 1ee7d000 (malloc_usable_size)
    426     04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
    427     04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
    428     04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
    429     04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
    430     04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
    431 
    432 This indicates that a function (malloc\_usable\_size) was called with
    433 a pointer that is either not allocated memory, or that the memory of
    434 the pointer has been corrupted.
    435 
    436 As with the other error message, the function in parenthesis is the
    437 function that was called with the bad pointer.
    438 
    439 Backtrace Heap Dump Format
    440 ==========================
    441 
    442 This section describes the format of the backtrace heap dump. This data is
    443 generated by am dumpheap -n or, as of P, by the signal or on exit.
    444 
    445 The data has this header:
    446 
    447     Android Native Heap Dump v1.0
    448 
    449     Total memory: XXXX
    450     Allocation records: YYYY
    451     Backtrace size: ZZZZ
    452 
    453 Total memory is the total of all of the currently live allocations.
    454 Allocation records is the total number of allocation records.
    455 Backtrace size is the maximum number of backtrace frames that can be present.
    456 
    457 Following this header are two different sections, the first section is the
    458 allocation records, the second section is the map data.
    459 
    460 The allocation record data has this format:
    461 
    462     z ZYGOTE_CHILD_ALLOC  sz    ALLOCATION_SIZE  num  NUM_ALLOCATIONS bt FRAMES
    463 
    464 ZYGOTE\_CHILD\_ALLOC is either 0 or 1. 0 means this was allocated by the
    465 zygote process or in a process not spawned from the zygote. 1 means this
    466 was allocated by an application after it forked off from the zygote process.
    467 
    468 ALLOCATION\_SIZE is the size of the allocation.
    469 NUM\_ALLOCATIONS is the number of allocations that have this size and have the
    470 same backtrace.
    471 FRAMES is a list of instruction pointers that represent the backtrace of the
    472 allocation.
    473 
    474 Example:
    475 
    476     z 0  sz      400  num    1  bt 0000a230 0000b500
    477     z 1  sz      500  num    3  bt 0000b000 0000c000
    478 
    479 The first allocation record was created by the zygote of size 400 only one
    480 with this backtrace/size and a backtrace of 0xa230, 0xb500.
    481 The second allocation record was create by an application spawned from the
    482 zygote of size 500, where there are three of these allocation with the same
    483 backtrace/size and a backtrace of 0xb000, 0xc000.
    484 
    485 The final section is the map data for the process:
    486 
    487     MAPS
    488     7fe9181000-7fe91a2000 rw-p 00000000 00:00 0                              /system/lib/libc.so
    489     .
    490     .
    491     .
    492     END
    493 
    494 The map data is simply the output of /proc/PID/maps. This data can be used to
    495 decode the frames in the backtraces.
    496 
    497 There is a tool to visualize this data, development/scripts/native\_heapdump\_viewer.py.
    498 
    499 Examples
    500 ========
    501 
    502 ### For platform developers
    503 
    504 Enable backtrace tracking of all allocation for all processes:
    505 
    506     adb shell stop
    507     adb shell setprop libc.debug.malloc.options backtrace
    508     adb shell start
    509 
    510 Enable backtrace tracking for a specific process (ls):
    511 
    512     adb shell setprop libc.debug.malloc.options backtrace
    513     adb shell setprop libc.debug.malloc.program ls
    514     adb shell ls
    515 
    516 Enable backtrace tracking for the zygote and zygote based processes:
    517 
    518     adb shell stop
    519     adb shell setprop libc.debug.malloc.program app_process
    520     adb shell setprop libc.debug.malloc.options backtrace
    521     adb shell start
    522 
    523 Enable multiple options (backtrace and guard):
    524 
    525     adb shell stop
    526     adb shell setprop libc.debug.malloc.options "\"backtrace guard\""
    527     adb shell start
    528 
    529 Note: The two levels of quoting in the adb shell command is necessary.
    530 The outer layer of quoting is for the shell on the host, to ensure that the
    531 inner layer of quoting is sent to the device, to make 'backtrace guard'
    532 a single argument.
    533 
    534 Enable malloc debug using an environment variable (pre-O Android release):
    535 
    536     adb shell
    537     # setprop libc.debug.malloc.env_enabled 1
    538     # setprop libc.debug.malloc.options backtrace
    539     # export LIBC_DEBUG_MALLOC_ENABLE=1
    540     # ls
    541 
    542 Enable malloc debug using an environment variable (Android O or later):
    543 
    544     adb shell
    545     # export LIBC_DEBUG_MALLOC_OPTIONS=backtrace
    546     # ls
    547 
    548 Any process spawned from this shell will run with malloc debug enabled
    549 using the backtrace option.
    550 
    551     adb shell stop
    552     adb shell setprop libc.debug.malloc.options backtrace
    553     adb shell start
    554     adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
    555 
    556 It is possible to use the backtrace\_enable\_on\_signal option as well,
    557 but, obviously, it must be enabled through the signal before the file will
    558 contain any data.
    559 
    560 ### For app developers
    561 
    562 Enable malloc debug for a specific program/application (Android O or later):
    563 
    564     adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
    565 
    566 For example, to enable malloc debug for the google search box (Android O or later):
    567 
    568     adb shell setprop wrap.com.google.android.googlequicksearchbox '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
    569     adb shell am force-stop com.google.android.googlequicksearchbox
    570 
    571 NOTE: On pre-O versions of the Android OS, property names had a length limit
    572 of 32. This meant that to create a wrap property with the name of the app, it
    573 was necessary to truncate the name to fit. On O, property names can be
    574 an order of magnitude larger, so there should be no need to truncate the name
    575 at all.
    576 
    577 To detect leaks while an app is running:
    578 
    579     adb shell dumpsys meminfo --unreachable <PID_OF_APP>
    580 
    581 Without also enabling malloc debug, this command will only tell
    582 you whether it can detect leaked memory, not where those leaks are
    583 occurring. If you enable malloc debug with the backtrace option for your
    584 app before running the dumpsys command, you'll get backtraces showing
    585 where the memory was allocated.
    586 
    587 For backtraces from your app to be useful, you'll want to keep the
    588 symbols in your app's shared libraries rather than stripping them. That
    589 way you'll see the location of the leak directly without having to use
    590 something like the <code>ndk-stack</code> tool.
    591 
    592 ### Analyzing heap dumps
    593 
    594 To analyze the data produced by the dumpheap command, run this script:
    595 
    596     development/scripts/native_heapdump_viewer.py
    597 
    598 In order for the script to properly symbolize the stacks in the file,
    599 make sure the script is executed from the tree that built the image.
    600 
    601 To collect, transfer, and analyze a dump:
    602 
    603     adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
    604     adb shell pull /data/local/tmp/heap.txt .
    605     python development/scripts/native_heapdump_viewer.py --symbols /some/path/to/symbols/ heap.txt > heap_info.txt
    606 
    607 At the moment, the script will look for symbols in the given directory,
    608 using the path the .so file would have on the device. So if your .so file
    609 is at `/data/app/.../lib/arm/libx.so` on the device, it will need to be at
    610 `/some/path/to/symbols/data/app/.../lib/arm/libx.so` locally given the
    611 command line above. That is: you need to mirror the directory structure
    612 for the app in the symbols directory.
    613 

README_api.md

      1 Native Memory Tracking using libc Callbacks
      2 -------------------------------------------
      3 Malloc debug can be used to get information on all of the live allocations
      4 in a process. The libc library in Android exports two calls that can be
      5 used to gather this data from a process. This tracking can be enabled using
      6 either the backtrace option or the backtrace\_enabled\_on\_signal option.
      7 
      8 The function to gather the data:
      9 
     10 `extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overall_size, size_t* info_size, size_t* total_memory, size_t* backtrace_size);`
     11 
     12 *info* is set to a buffer allocated by the call that contains all of
     13 the allocation information.
     14 *overall\_size* is set to the total size of the buffer returned. If this
     15 *info\_size*
     16 value is zero, then there are no allocation being tracked.
     17 *total\_memory* is set to the sum of all allocation sizes that are live at
     18 the point of the function call. This does not include the memory allocated
     19 by the malloc debug library itself.
     20 *backtrace\_size* is set to the maximum number of backtrace entries
     21 that are present for each allocation.
     22 
     23 In order to free the buffer allocated by the function, call:
     24 
     25 `extern "C" void free_malloc_leak_info(uint8_t* info);`
     26 
     27 ### Format of info Buffer
     28     size_t size_of_original_allocation
     29     size_t num_allocations
     30     uintptr_t pc1
     31     uintptr_t pc2
     32     uintptr_t pc3
     33     .
     34     .
     35     .
     36 
     37 The number of *uintptr\_t* values is determined by the value
     38 *backtrace\_size* as returned by the original call to
     39 *get\_malloc\_leak\_info*. This value is not variable, it is the same
     40 for all the returned data. The value
     41 *num\_allocations* contains the total number of allocations with the same
     42 backtrace and size as this allocation. On Android Nougat, this value was
     43 incorrectly set to the number of frames in the backtrace.
     44 Each *uintptr\_t* is a pc of the callstack. If the total number
     45 of backtrace entries is less than *backtrace\_size*, the rest of the
     46 entries are zero.
     47 The calls from within the malloc debug library are automatically removed.
     48 
     49 For 32 bit systems, *size\_t* and *uintptr\_t* are both 4 byte values.
     50 
     51 For 64 bit systems, *size\_t* and *uintptr\_t* are both 8 byte values.
     52 
     53 The total number of these structures returned in *info* is
     54 *overall\_size* divided by *info\_size*.
     55 
     56 Note, the size value in each allocation data structure will have bit 31 set
     57 if this allocation was created in a process forked from the Zygote process.
     58 This helps to distinguish between native allocations created by the application.
     59 

README_marshmallow_and_earlier.md

      1 Malloc Debug
      2 ============
      3 
      4 Malloc debug is a method of debugging native memory problems. It can help
      5 detect memory corruption, memory leaks, and use after free issues.
      6 
      7 This documentation describes how to enable this feature on API level
      8 23 or older. Note: malloc debug was full of bugs and was not fully
      9 functional until API level 19, so using it on a version older than that
     10 is not guaranteed to work at all.
     11 
     12 The documentation for malloc debug on newer versions of Android is
     13 [here](README.md).
     14 
     15 On these old versions of the OS, you must be able to set system properties
     16 using the setprop command from the shell. This requires the ability to
     17 run as root on the device.
     18 
     19 When malloc debug is enabled, it works by adding a shim layer that replaces
     20 the normal allocation calls. The replaced calls are:
     21 
     22 * `malloc`
     23 * `free`
     24 * `calloc`
     25 * `realloc`
     26 * `posix_memalign`
     27 * `memalign`
     28 * `malloc_usable_size`
     29 
     30 On 32 bit systems, these two deprecated functions are also replaced:
     31 
     32 * `pvalloc`
     33 * `valloc`
     34 
     35 Any errors detected by the library are reported in the log.
     36 
     37 Controlling Malloc Debug Behavior
     38 ---------------------------------
     39 Malloc debug is controlled by a system property that takes a numeric value
     40 named libc.debug.malloc. It has only a few distinct modes that enables a
     41 set of different malloc debug checks at once.
     42 
     43 Value 1
     44 --------
     45 When enabled, this value creates a special header to all allocations
     46 that contains information about the allocation.
     47 
     48 ### Backtrace at Allocation Creation
     49 Enable capturing the backtrace of each allocation site. Only the
     50 first 16 frames of the backtrace will be captured.
     51 This option will slow down allocations by an order of magnitude, and
     52 might cause timeouts when trying to start a device.
     53 
     54 ### Track Live Allocations
     55 All of the currently live allocations will be tracked and can be retrieved
     56 by a call to get\_malloc\_leak\_info (see README\_api.md for details).
     57 
     58 Note: If multiple allocations have the same exact backtrace, then only one
     59 entry is returned in the list.
     60 
     61 Value 5
     62 -------
     63 When enabled, this value does not create a special header. It only modifies
     64 the content of allocations.
     65 
     66 Whenever an allocation is created, initialize the data with a known
     67 pattern (0xeb). This does not happen for the calloc calls.
     68 Whenever an allocation is freed, write a known pattern over the data (0xef).
     69 
     70 Value 10
     71 --------
     72 When enabled, this value creates a special header to all allocations
     73 that contains information about the allocation.
     74 
     75 This value enables everything enabled with value 1 plus these other options.
     76 
     77 ### Allocation Guards
     78 A 32 byte buffer is placed before the returned allocation (known as
     79 a front guard). This buffer is filled with the pattern (0xaa). In addition,
     80 a 32 byte buffer is placed after the data for the returned allocation (known
     81 as a rear guard). This buffer is filled with the pattern (0xbb).
     82 
     83 When the allocation is freed, both of these guards are verified to contain
     84 the expected patterns. If not, then an error message is printed to the log.
     85 
     86 ### Free Memory Tracking
     87 When a pointer is freed, do not free the memory right away, but add it to
     88 a list of freed allocations. In addition to being added to the list, the
     89 entire allocation is filled with the value 0xef, and the backtrace at
     90 the time of the free is recorded. As with the backtrace on allocation,
     91 only up to 16 frames will be recorded.
     92 
     93 When the list of freed allocations reaches 100, the oldest allocation
     94 on the list is removed and verified that it still contains the pattern 0xef.
     95 If the entire allocation is not filled with this value, an error is printed
     96 to the log.
     97 
     98 ### Log Leaks
     99 When the program completes, all of the allocations that are still live
    100 are printed to the log as leaks. This isn't very useful since it tends
    101 to display a lot of false positive because many programs do not free
    102 everything before terminating.
    103 
    104 Option 20
    105 ---------
    106 Do not use this option value, it only works on the emulator. It has not
    107 been verified, so it may or may not work.
    108 
    109 Enable on Certain Processes
    110 ---------------------------
    111 Using the special system property, libc.debug.malloc.program, will
    112 cause malloc debug to only be used on processes with that name. For example,
    113 if the property is set to ls, then only the program named ls will have malloc
    114 debug enabled.
    115 
    116 Examples
    117 ========
    118 Enable malloc debug for all allocations for all processes:
    119 
    120     adb shell stop
    121     adb shell setprop libc.debug.malloc 1
    122     adb shell start
    123 
    124 Enable malloc debug for a particular process:
    125 
    126     adb shell setprop libc.debug.malloc.program ls
    127     adb shell setprop libc.debug.malloc 10
    128     adb shell ls /data/local/tmp
    129