blob: 6b046db26074ed4223b1d6ce18c15caf180b1110 [file] [log] [blame] [view]
Christopher Ferris713a8e32016-03-18 14:29:51 -07001Malloc Debug
2============
3
4Malloc debug is a method of debugging native memory problems. It can help
5detect memory corruption, memory leaks, and use after free issues.
6
Christopher Ferriseab48032016-05-25 13:04:29 -07007This documentation describes how to enable this feature on Android N or later
Elliott Hughes7dc7d2b2018-04-06 14:44:49 -07008versions of the Android OS. (See the "Examples" section.)
Christopher Ferriseab48032016-05-25 13:04:29 -07009
10The documentation for malloc debug on older versions of Android is
11[here](README_marshmallow_and_earlier.md).
12
Christopher Ferriseab48032016-05-25 13:04:29 -070013When malloc debug is enabled, it works by adding a shim layer that replaces
14the normal allocation calls. The replaced calls are:
Christopher Ferris713a8e32016-03-18 14:29:51 -070015
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070016* `malloc`
17* `free`
18* `calloc`
19* `realloc`
20* `posix_memalign`
21* `memalign`
Christopher Ferriscae21a92018-02-05 18:14:55 -080022* `aligned_alloc`
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070023* `malloc_usable_size`
Christopher Ferris713a8e32016-03-18 14:29:51 -070024
25On 32 bit systems, these two deprecated functions are also replaced:
26
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070027* `pvalloc`
28* `valloc`
Christopher Ferris713a8e32016-03-18 14:29:51 -070029
30Any errors detected by the library are reported in the log.
31
Christopher Ferris4da25032018-03-07 13:38:48 -080032NOTE: There is a small behavioral change beginning in P for realloc.
33Before, a realloc from one size to a smaller size would not update the
34backtrace related to the allocation. Starting in P, every single realloc
35call changes the backtrace for the pointer no matter whether the pointer
36returned has changed or not.
37
38
Christopher Ferris713a8e32016-03-18 14:29:51 -070039Controlling Malloc Debug Behavior
40---------------------------------
41Malloc debug is controlled by individual options. Each option can be enabled
42individually, or in a group of other options. Every single option can be
43combined with every other option.
44
45Option Descriptions
46-------------------
47### front\_guard[=SIZE\_BYTES]
48Enables a small buffer placed before the allocated data. This is an attempt
49to find memory corruption occuring to a region before the original allocation.
50On first allocation, this front guard is written with a specific pattern (0xaa).
51When the allocation is freed, the guard is checked to verify it has not been
52modified. If any part of the front guard is modified, an error will be reported
53in the log indicating what bytes changed.
54
55If the backtrace option is also enabled, then any error message will include
56the backtrace of the allocation site.
57
58If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
59The default is 32 bytes, the max bytes is 16384. SIZE\_BYTES will be
60padded so that it is a multiple of 8 bytes on 32 bit systems and 16 bytes
61on 64 bit systems to make sure that the allocation returned is aligned
62properly.
63
64This option adds a special header to all allocations that contains the guard
65and information about the original allocation.
66
67Example error:
68
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070069 04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED FRONT GUARD
70 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-32] = 0x00 (expected 0xaa)
71 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-15] = 0x02 (expected 0xaa)
Christopher Ferris713a8e32016-03-18 14:29:51 -070072
73### rear\_guard[=SIZE\_BYTES]
74Enables a small buffer placed after the allocated data. This is an attempt
75to find memory corruption occuring to a region after the original allocation.
76On first allocation, this rear guard is written with a specific pattern (0xbb).
77When the allocation is freed, the guard is checked to verify it has not been
78modified. If any part of the rear guard is modified, an error will be reported
79in the log indicating what bytes changed.
80
81If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
82The default is 32 bytes, the max bytes is 16384.
83
84This option adds a special header to all allocations that contains
85information about the original allocation.
86
87Example error:
88
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070089 04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED REAR GUARD
90 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[130] = 0xbf (expected 0xbb)
91 04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[131] = 0x00 (expected 0xbb)
Christopher Ferris713a8e32016-03-18 14:29:51 -070092
93### guard[=SIZE\_BYTES]
94Enables both a front guard and a rear guard on all allocations.
95
96If SIZE\_BYTES is present, it indicates the number of bytes in both guards.
97The default is 32 bytes, the max bytes is 16384.
98
99### backtrace[=MAX\_FRAMES]
100Enable capturing the backtrace of each allocation site.
101This option will slow down allocations by an order of magnitude. If the
102system runs too slowly with this option enabled, decreasing the maximum number
103of frames captured will speed the allocations up.
104
105Note that any backtrace frames that occur within the malloc backtrace library
106itself are not recorded.
107
108If MAX\_FRAMES is present, it indicates the maximum number of frames to
109capture in a backtrace. The default is 16 frames, the maximumum value
110this can be set to is 256.
111
Christopher Ferris4da25032018-03-07 13:38:48 -0800112Before P, this option adds a special header to all allocations that contains
113the backtrace and information about the original allocation. After that, this
114option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700115
Christopher Ferris602b88c2017-08-04 13:04:04 -0700116As of P, this option will also enable dumping backtrace heap data to a
Christopher Ferrisb42e8b42022-05-09 14:00:47 -0700117file when the process receives the signal SIGRTMAX - 17 ( which is 47 on
Christopher Ferris602b88c2017-08-04 13:04:04 -0700118Android devices). The format of this dumped data is the same format as
119that dumped when running am dumpheap -n. The default is to dump this data
120to the file /data/local/tmp/backtrace\_heap.**PID**.txt. This is useful when
121used with native only executables that run for a while since these processes
122are not spawned from a zygote process.
123
124Note that when the signal is received, the heap is not dumped until the next
125malloc/free occurs.
126
Christopher Ferris713a8e32016-03-18 14:29:51 -0700127### backtrace\_enable\_on\_signal[=MAX\_FRAMES]
128Enable capturing the backtrace of each allocation site. If the
129backtrace capture is toggled when the process receives the signal
Christopher Ferrisb42e8b42022-05-09 14:00:47 -0700130SIGRTMAX - 19 (which is 45 on Android devices). When this
Christopher Ferris713a8e32016-03-18 14:29:51 -0700131option is used alone, backtrace capture starts out disabled until the signal
132is received. If both this option and the backtrace option are set, then
133backtrace capture is enabled until the signal is received.
134
135If MAX\_FRAMES is present, it indicates the maximum number of frames to
136capture in a backtrace. The default is 16 frames, the maximumum value
137this can be set to is 256.
138
Christopher Ferris4da25032018-03-07 13:38:48 -0800139Before P, this option adds a special header to all allocations that contains
140the backtrace and information about the original allocation. After that, this
141option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700142
Christopher Ferris602b88c2017-08-04 13:04:04 -0700143### backtrace\_dump\_on\_exit
144As of P, when the backtrace option has been enabled, this causes the backtrace
145dump heap data to be dumped to a file when the program exits. If the backtrace
146option has not been enabled, this does nothing. The default is to dump this
147to the file named /data/local/tmp/backtrace\_heap.**PID**.exit.txt.
148
149The file location can be changed by setting the backtrace\_dump\_prefix
150option.
151
152### backtrace\_dump\_prefix
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700153As of P, when one of the backtrace options has been enabled, this sets the
154prefix used for dumping files when the signal SIGRTMAX - 17 is received or when
Christopher Ferris602b88c2017-08-04 13:04:04 -0700155the program exits and backtrace\_dump\_on\_exit is set.
156
157The default is /data/local/tmp/backtrace\_heap.
158
159When this value is changed from the default, then the filename chosen
160on the signal will be backtrace\_dump\_prefix.**PID**.txt. The filename chosen
161when the program exits will be backtrace\_dump\_prefix.**PID**.exit.txt.
162
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700163### backtrace\_full
Christopher Ferris2e1a40a2018-06-13 10:46:34 -0700164As of Q, any time that a backtrace is gathered, a different algorithm is used
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700165that is extra thorough and can unwind through Java frames. This will run
166slower than the normal backtracing function.
167
Christopher Ferrisb42e8b42022-05-09 14:00:47 -0700168### check\_unreachable\_on\_signal
169As of Android U, this option will trigger a check for unreachable memory
170in a process. Specifically, if the signal SIGRTMAX - 16 (which is 48 on
171Android devices). The best way to see the exact signal being used is to
172enable the verbose option then look at the log for the message:
173
174 Run: 'kill -48 <PID>' to check for unreachable memory.
175
176When the signal is received, the actual unreachable check only triggers
177on the next allocation that happens in the process (malloc/free, etc).
178
179If a process is not doing any allocations, it can be forced to trigger when
180running:
181
182 debuggerd -b <PID>
183
184**NOTE**: The unreachable check can fail for protected processes, so it
185might be necessary to run:
186
187 setenforce 0
188
189To get the unreachable data.
190
Christopher Ferris713a8e32016-03-18 14:29:51 -0700191### fill\_on\_alloc[=MAX\_FILLED\_BYTES]
192Any allocation routine, other than calloc, will result in the allocation being
193filled with the value 0xeb. When doing a realloc to a larger size, the bytes
194above the original usable size will be set to 0xeb.
195
196If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
197of bytes in the allocation. The default is to fill the entire allocation.
198
199### fill\_on\_free[=MAX\_FILLED\_BYTES]
200When an allocation is freed, fill it with 0xef.
201
202If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
203of bytes in the allocation. The default is to fill the entire allocation.
204
205### fill[=MAX\_FILLED\_BYTES]
206This enables both the fill\_on\_alloc option and the fill\_on\_free option.
207
208If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
209of bytes in the allocation. The default is to fill the entire allocation.
210
211### expand\_alloc[=EXPAND\_BYTES]
212Add an extra amount to allocate for every allocation.
213
214If XX is present, it is the number of bytes to expand the allocation by.
215The default is 16 bytes, the max bytes is 16384.
216
217### free\_track[=ALLOCATION\_COUNT]
218When a pointer is freed, do not free the memory right away, but add it to
219a list of freed allocations. In addition to being added to the list, the
220entire allocation is filled with the value 0xef, and the backtrace at
221the time of the free is recorded. The backtrace recording is completely
222separate from the backtrace option, and happens automatically if this
223option is enabled. By default, a maximum of 16 frames will be recorded,
224but this value can be changed using the free\_track\_backtrace\_num\_frames
225option. It can also be completely disabled by setting the option to zero.
226See the full description of this option below.
227
228When the list is full, an allocation is removed from the list and is
229checked to make sure that none of the contents have been modified since
230being placed on the list. When the program terminates, all of the allocations
231left on the list are verified.
232
233If ALLOCATION\_COUNT is present, it indicates the total number of allocations
234in the list. The default is to record 100 freed allocations, the max
235allocations to record is 16384.
236
Christopher Ferris4da25032018-03-07 13:38:48 -0800237Before P, this option adds a special header to all allocations that contains
238the backtrace and information about the original allocation. After that, this
239option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700240
241Example error:
242
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700243 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE
244 04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[20] = 0xaf (expected 0xef)
245 04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[99] = 0x12 (expected 0xef)
246 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of free:
247 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
248 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
249 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
250 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700251
252In addition, there is another type of error message that can occur if
253an allocation has a special header applied, and the header is corrupted
254before the verification occurs. This is the error message that will be found
255in the log:
256
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700257 04-15 12:00:31.604 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE
Christopher Ferris713a8e32016-03-18 14:29:51 -0700258
259### free\_track\_backtrace\_num\_frames[=MAX\_FRAMES]
260This option only has meaning if free\_track is set. It indicates how many
261backtrace frames to capture when an allocation is freed.
262
263If MAX\_FRAMES is present, it indicates the number of frames to capture.
264If the value is set to zero, then no backtrace will be captured when the
265allocation is freed. The default is to record 16 frames, the max number of
266frames to to record is 256.
267
268### leak\_track
269Track all live allocations. When the program terminates, all of the live
270allocations will be dumped to the log. If the backtrace option was enabled,
271then the log will include the backtrace of the leaked allocations. This
272option is not useful when enabled globally because a lot of programs do not
273free everything before the program terminates.
274
Christopher Ferris4da25032018-03-07 13:38:48 -0800275Before P, this option adds a special header to all allocations that contains
276the backtrace and information about the original allocation. After that, this
277option will not add a special header.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700278
279Example leak error found in the log:
280
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700281 04-15 12:35:33.304 7412 7412 E malloc_debug: +++ APP leaked block of size 100 at 0x2be3b0b0 (leak 1 of 2)
282 04-15 12:35:33.304 7412 7412 E malloc_debug: Backtrace at time of allocation:
283 04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
284 04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
285 04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
286 04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
287 04-15 12:35:33.305 7412 7412 E malloc_debug: +++ APP leaked block of size 24 at 0x7be32380 (leak 2 of 2)
288 04-15 12:35:33.305 7412 7412 E malloc_debug: Backtrace at time of allocation:
289 04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
290 04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
291 04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
292 04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700293
Christopher Ferris7bd01782016-04-20 12:30:58 -0700294### record\_allocs[=TOTAL\_ENTRIES]
295Keep track of every allocation/free made on every thread and dump them
Christopher Ferrisb42e8b42022-05-09 14:00:47 -0700296to a file when the signal SIGRTMAX - 18 (which is 46 on Android devices)
Christopher Ferris7bd01782016-04-20 12:30:58 -0700297is received.
298
299If TOTAL\_ENTRIES is set, then it indicates the total number of
300allocation/free records that can be retained. If the number of records
301reaches the TOTAL\_ENTRIES value, then any further allocations/frees are
302not recorded. The default value is 8,000,000 and the maximum value this
303can be set to is 50,000,000.
304
305Once the signal is received, and the current records are written to the
306file, all current records are deleted. Any allocations/frees occuring while
307the data is being dumped to the file are ignored.
308
309**NOTE**: This option is not available until the O release of Android.
310
311The allocation data is written in a human readable format. Every line begins
312with the THREAD\_ID returned by gettid(), which is the thread that is making
313the allocation/free. If a new thread is created, no special line is added
314to the file. However, when a thread completes, a special entry is added to
315the file indicating this.
316
317The thread complete line is:
318
319**THREAD\_ID**: thread\_done 0x0
320
321Example:
322
323 187: thread_done 0x0
324
325Below is how each type of allocation/free call ends up in the file dump.
326
327pointer = malloc(size)
328
329**THREAD\_ID**: malloc pointer size
330
331Example:
332
333 186: malloc 0xb6038060 20
334
335free(pointer)
336
337**THREAD\_ID**: free pointer
338
339Example:
340
341 186: free 0xb6038060
342
343pointer = calloc(nmemb, size)
344
345**THREAD\_ID**: calloc pointer nmemb size
346
347Example:
348
349 186: calloc 0xb609f080 32 4
350
351new\_pointer = realloc(old\_pointer, size)
352
353**THREAD\_ID**: realloc new\_pointer old\_pointer size
354
355Example:
356
357 186: realloc 0xb609f080 0xb603e9a0 12
358
359pointer = memalign(alignment, size)
360
361**THREAD\_ID**: memalign pointer alignment size
362
Christopher Ferriscae21a92018-02-05 18:14:55 -0800363pointer = aligned\_alloc(alignment, size)
364
365**THREAD\_ID**: memalign pointer alignment size
366
Christopher Ferris7bd01782016-04-20 12:30:58 -0700367posix\_memalign(&pointer, alignment, size)
368
369**THREAD\_ID**: memalign pointer alignment size
370
371Example:
372
373 186: memalign 0x85423660 16 104
374
375pointer = valloc(size)
376
377**THREAD\_ID**: memalign pointer 4096 size
378
379Example:
380
381 186: memalign 0x85423660 4096 112
382
383pointer = pvalloc(size)
384
385**THREAD\_ID**: memalign pointer 4096 <b>SIZE\_ROUNDED\_UP\_TO\_4096</b>
386
387Example:
388
389 186: memalign 0x85423660 4096 8192
390
391### record\_allocs\_file[=FILE\_NAME]
392This option only has meaning if record\_allocs is set. It indicates the
393file where the recorded allocations will be found.
394
395If FILE\_NAME is set, then it indicates where the record allocation data
396will be placed.
397
398**NOTE**: This option is not available until the O release of Android.
399
Christopher Ferris4da25032018-03-07 13:38:48 -0800400### verify\_pointers
401Track all live allocations to determine if a pointer is used that does not
402exist. This option is a lightweight way to verify that all
403free/malloc\_usable\_size/realloc calls are passed valid pointers.
404
405Example error:
406
407 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 UNKNOWN POINTER (free)
408 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
409 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
410 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
411 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
412 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
413
414Where the name of the function varies depending on the function that called
415with a bad pointer. Only three functions do this checking: free,
416malloc\_usable\_size, realloc.
417
418**NOTE**: This option is not available until the P release of Android.
419
Iris Chang7f209a92019-01-16 11:17:15 +0800420### abort\_on\_error
421When malloc debug detects an error, abort after sending the error
422log message.
423
424**NOTE**: If leak\_track is enabled, no abort occurs if leaks have been
425detected when the process is exiting.
426
Christopher Ferrisc328e442019-04-01 19:31:26 -0700427### verbose
428As of Android Q, all info messages will be turned off by default. For example,
429in Android P and older, enabling malloc debug would result in this message
430in the log:
431
432 08-16 15:54:16.060 26947 26947 I libc : /system/bin/app_process64: malloc debug enabled
433
434In android Q, this message will not be displayed because these info messages
435slow down process start up. However, if you want to re-enable these messages,
436add the verbose option. All of the "Run XXX" messages are also silenced unless
437the verbose option is specified. This is an example of the type
438of messages that are no longer displayed:
439
440 09-10 01:03:50.070 557 557 I malloc_debug: /system/bin/audioserver: Run: 'kill -47 557' to dump the backtrace.
441
Christopher Ferris713a8e32016-03-18 14:29:51 -0700442Additional Errors
443-----------------
444There are a few other error messages that might appear in the log.
445
446### Use After Free
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700447 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (free)
448 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace of original free:
449 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
450 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
451 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
452 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
453 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
454 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
455 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
456 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
457 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700458
459This indicates that code is attempting to free an already freed pointer. The
460name in parenthesis indicates that the application called the function
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700461*free* with the bad pointer.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700462
463For example, this message:
464
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700465 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (realloc)
Christopher Ferris713a8e32016-03-18 14:29:51 -0700466
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700467Would indicate that the application called the *realloc* function
Christopher Ferris713a8e32016-03-18 14:29:51 -0700468with an already freed pointer.
469
470### Invalid Tag
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700471 04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS INVALID TAG 1ee7d000 (malloc_usable_size)
472 04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
473 04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
474 04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
475 04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
476 04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
Christopher Ferris713a8e32016-03-18 14:29:51 -0700477
478This indicates that a function (malloc\_usable\_size) was called with
479a pointer that is either not allocated memory, or that the memory of
480the pointer has been corrupted.
481
482As with the other error message, the function in parenthesis is the
483function that was called with the bad pointer.
484
Christopher Ferris602b88c2017-08-04 13:04:04 -0700485Backtrace Heap Dump Format
486==========================
487
488This section describes the format of the backtrace heap dump. This data is
489generated by am dumpheap -n or, as of P, by the signal or on exit.
490
491The data has this header:
492
493 Android Native Heap Dump v1.0
494
495 Total memory: XXXX
496 Allocation records: YYYY
497 Backtrace size: ZZZZ
498
499Total memory is the total of all of the currently live allocations.
500Allocation records is the total number of allocation records.
501Backtrace size is the maximum number of backtrace frames that can be present.
502
503Following this header are two different sections, the first section is the
504allocation records, the second section is the map data.
505
506The allocation record data has this format:
507
508 z ZYGOTE_CHILD_ALLOC sz ALLOCATION_SIZE num NUM_ALLOCATIONS bt FRAMES
509
510ZYGOTE\_CHILD\_ALLOC is either 0 or 1. 0 means this was allocated by the
511zygote process or in a process not spawned from the zygote. 1 means this
512was allocated by an application after it forked off from the zygote process.
513
514ALLOCATION\_SIZE is the size of the allocation.
515NUM\_ALLOCATIONS is the number of allocations that have this size and have the
516same backtrace.
517FRAMES is a list of instruction pointers that represent the backtrace of the
518allocation.
519
520Example:
521
522 z 0 sz 400 num 1 bt 0000a230 0000b500
523 z 1 sz 500 num 3 bt 0000b000 0000c000
524
525The first allocation record was created by the zygote of size 400 only one
526with this backtrace/size and a backtrace of 0xa230, 0xb500.
527The second allocation record was create by an application spawned from the
528zygote of size 500, where there are three of these allocation with the same
529backtrace/size and a backtrace of 0xb000, 0xc000.
530
531The final section is the map data for the process:
532
533 MAPS
534 7fe9181000-7fe91a2000 rw-p 00000000 00:00 0 /system/lib/libc.so
535 .
536 .
537 .
538 END
539
540The map data is simply the output of /proc/PID/maps. This data can be used to
541decode the frames in the backtraces.
542
Christopher Ferris2e1a40a2018-06-13 10:46:34 -0700543There are now multiple versions of the file:
544
545Android P produces version v1.1 of the heap dump.
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700546
547 Android Native Heap Dump v1.1
548
Christopher Ferris2e1a40a2018-06-13 10:46:34 -0700549The only difference between v1.0 and v1.1 is that the NUM\_ALLOCATIONS
550value is always accurate in v1.1. A previous version of malloc debug set
551NUM\_ALLOCATIONS to an incorrect value. For heap dump v1.0, the
552NUM\_ALLOCATIONS value should be treated as always 1 no matter what is
553actually present.
554
555Android Q introduces v1.2 of the heap dump. The new header looks like this:
556
557 Android Native Heap Dump v1.2
558
559 Build fingerprint: 'google/taimen/taimen:8.1.0/OPM2.171026.006.C1/4769658:user/release-keys'
560
561The new line fingerprint line is the contents of the ro.build.fingerprint
562property.
563
564The new version no longer 0 pads the backtrace addresses. In v1.0/v1.1:
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700565
566 z 0 sz 400 num 1 bt 0000a230 0000b500
567
Christopher Ferris2e1a40a2018-06-13 10:46:34 -0700568While v1.2:
Christopher Ferris93bdd6a2018-04-05 11:12:38 -0700569
570 z 0 sz 400 num 1 bt a230 b500
571
572In addition, when the new option backtrace\_full is used, another line will
573be added to every backtrace line. The line will be:
574
575 bt_info {"MAP_NAME" RELATIVE_TO_MAP_PC "FUNCTION_NAME" FUNCTION_OFFSET} ...
576
577For each backtrace pc, there will be one element in braces.
578
579MAP\_NAME is the name of the map in which the backtrace pc exists. If there is
580no valid map name, this will be empty.
581RELATIVE\_TO\_MAP\_PC is the hexadecimal value of the relative pc to the map.
582FUNCTION\_NAME the name of the function for this pc. If there is no valid
583function name, then it will be empty.
584FUNCTION\_OFFSET the hexadecimal offset from the beginning of the function. If
585the FUNCTION\_NAME is empty, then this value will always be zero.
586
587An example of this new format:
588
589 z 0 sz 400 num 1 bt a2a0 b510
590 bt_info {"/system/libc.so" 2a0 "abort" 24} {"/system/libutils.so" 510 "" 0}
591
592In this example, the first backtrace frame has a pc of 0xa2a0 and is in the
593map named /system/libc.so which starts at 0xa000. The relative pc is 0x2a0,
594and it is in the function abort + 0x24.
595The second backtrace frame has a pc of 0xb510 and is in the map named
596/system/libutils.so which starts at 0xb000. The relative pc is 0x510 and
597it is in an unknown function.
598
Christopher Ferris713a8e32016-03-18 14:29:51 -0700599Examples
600========
Elliott Hughes644275a2017-08-15 23:17:35 -0700601
602### For platform developers
603
Christopher Ferris713a8e32016-03-18 14:29:51 -0700604Enable backtrace tracking of all allocation for all processes:
605
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700606 adb shell stop
607 adb shell setprop libc.debug.malloc.options backtrace
608 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700609
610Enable backtrace tracking for a specific process (ls):
611
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700612 adb shell setprop libc.debug.malloc.options backtrace
613 adb shell setprop libc.debug.malloc.program ls
614 adb shell ls
Christopher Ferris713a8e32016-03-18 14:29:51 -0700615
616Enable backtrace tracking for the zygote and zygote based processes:
617
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700618 adb shell stop
619 adb shell setprop libc.debug.malloc.program app_process
620 adb shell setprop libc.debug.malloc.options backtrace
621 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700622
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800623Enable multiple options (backtrace and guard):
Christopher Ferris713a8e32016-03-18 14:29:51 -0700624
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700625 adb shell stop
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800626 adb shell setprop libc.debug.malloc.options "\"backtrace guard\""
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700627 adb shell start
Christopher Ferris713a8e32016-03-18 14:29:51 -0700628
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700629Note: The two levels of quoting in the adb shell command is necessary.
630The outer layer of quoting is for the shell on the host, to ensure that the
Mikhail Naganov5a1a9532018-01-03 08:50:16 -0800631inner layer of quoting is sent to the device, to make 'backtrace guard'
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700632a single argument.
Christopher Ferris713a8e32016-03-18 14:29:51 -0700633
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700634Enable malloc debug using an environment variable (pre-O Android release):
Christopher Ferris713a8e32016-03-18 14:29:51 -0700635
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700636 adb shell
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700637 # setprop libc.debug.malloc.env_enabled 1
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700638 # setprop libc.debug.malloc.options backtrace
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700639 # export LIBC_DEBUG_MALLOC_ENABLE=1
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -0700640 # ls
Christopher Ferrisac66d162016-09-28 14:51:12 -0700641
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700642Enable malloc debug using an environment variable (Android O or later):
643
644 adb shell
645 # export LIBC_DEBUG_MALLOC_OPTIONS=backtrace
646 # ls
647
648Any process spawned from this shell will run with malloc debug enabled
649using the backtrace option.
Christopher Ferrisac66d162016-09-28 14:51:12 -0700650
651 adb shell stop
652 adb shell setprop libc.debug.malloc.options backtrace
653 adb shell start
654 adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
655
656It is possible to use the backtrace\_enable\_on\_signal option as well,
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700657but, obviously, it must be enabled through the signal before the file will
658contain any data.
659
Elliott Hughes644275a2017-08-15 23:17:35 -0700660### For app developers
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700661
Elliott Hughes5ad14212018-04-06 15:13:14 -0700662App developers should check the NDK documentation about
663[wrap.sh](https://developer.android.com/ndk/guides/wrap-script.html)
664for the best way to use malloc debug in Android O or later on non-rooted
665devices.
666
Christopher Ferris8cbba802022-03-02 13:23:31 -0800667**NOTE**: Android 12 introduced a bug that can cause the wrap.\<APP\> property to
668no longer work. Use the commands below so that the wrap.\<APP\> instructions will work:
669
670 adb shell setprop dalvik.vm.force-java-zygote-fork-loop true
671 adb shell stop
672 adb shell start
673
Elliott Hughes5ad14212018-04-06 15:13:14 -0700674If you do have a rooted device, you can enable malloc debug for a specific
675program/application (Android O or later):
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700676
677 adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
678
Christopher Ferris1d52a7b2018-06-01 13:40:38 -0700679If you need to enable multiple options using this method, then you can set
680them like so:
681
682 adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace\ leak_track\ fill logwrapper"'
683
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700684For example, to enable malloc debug for the google search box (Android O or later):
685
686 adb shell setprop wrap.com.google.android.googlequicksearchbox '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
687 adb shell am force-stop com.google.android.googlequicksearchbox
688
Christopher Ferrisad935c82018-08-16 15:59:48 -0700689If you are setting multiple options and the app does not appear to start
690properly, check the logcat looking for this message
691(`adb logcat -d | grep "malloc debug"`):
692
693 08-16 15:54:16.060 26947 26947 I libc : /system/bin/app_process64: malloc debug enabled
694
695If you do not see this message, then the wrap property was not set correctly.
696Run:
697
698 adb shell getprop | grep wrap
699
700And verify that any spaces are properly escaped.
701
Christopher Ferris4c65669a2017-05-24 19:04:33 -0700702NOTE: On pre-O versions of the Android OS, property names had a length limit
703of 32. This meant that to create a wrap property with the name of the app, it
704was necessary to truncate the name to fit. On O, property names can be
705an order of magnitude larger, so there should be no need to truncate the name
706at all.
Elliott Hughes644275a2017-08-15 23:17:35 -0700707
708To detect leaks while an app is running:
709
710 adb shell dumpsys meminfo --unreachable <PID_OF_APP>
711
712Without also enabling malloc debug, this command will only tell
713you whether it can detect leaked memory, not where those leaks are
714occurring. If you enable malloc debug with the backtrace option for your
715app before running the dumpsys command, you'll get backtraces showing
716where the memory was allocated.
717
718For backtraces from your app to be useful, you'll want to keep the
719symbols in your app's shared libraries rather than stripping them. That
720way you'll see the location of the leak directly without having to use
721something like the <code>ndk-stack</code> tool.