Name Date Size #Lines LOC

..--

tests/H25-Apr-2025-5,1193,861

tools/H25-Apr-2025-335270

Android.bpH A D25-Apr-20254.4 KiB208174

Config.cppH A D25-Apr-202515.6 KiB520413

Config.hH A D25-Apr-20257.6 KiB187117

DebugData.cppH A D25-Apr-20253.1 KiB10660

DebugData.hH A D25-Apr-20253.1 KiB10151

GuardData.cppH A D25-Apr-20253.8 KiB10055

GuardData.hH A D25-Apr-20252.8 KiB9542

LogAllocatorStats.cppH A D25-Apr-20252.6 KiB7839

LogAllocatorStats.hH A D25-Apr-20251.6 KiB437

MapData.cppH A D25-Apr-20255.6 KiB203142

MapData.hH A D25-Apr-20253.1 KiB10456

Nanotime.hH A D25-Apr-20251.6 KiB398

OptionData.hH A D25-Apr-20251.6 KiB4410

PointerData.cppH A D25-Apr-202522.4 KiB665538

PointerData.hH A D25-Apr-20256.2 KiB197126

README.mdH A D25-Apr-202532.6 KiB794571

README_api.mdH A D25-Apr-20252.5 KiB5947

README_marshmallow_and_earlier.mdH A D25-Apr-20254.5 KiB12999

RecordData.cppH A D25-Apr-20255.2 KiB174111

RecordData.hH A D25-Apr-20252.3 KiB7735

Unreachable.cppH A D25-Apr-20252.8 KiB8142

Unreachable.hH A D25-Apr-20251.7 KiB5013

UnwindBacktrace.cppH A D25-Apr-20253.6 KiB10768

UnwindBacktrace.hH A D25-Apr-20251.6 KiB417

backtrace.cppH A D25-Apr-20255.7 KiB183122

backtrace.hH A D25-Apr-20251.7 KiB419

debug_disable.cppH A D25-Apr-20252.1 KiB6630

debug_disable.hH A D25-Apr-20252.1 KiB6223

debug_log.hH A D25-Apr-20252 KiB439

exported32.mapH A D25-Apr-2025588 3028

exported64.mapH A D25-Apr-2025551 2826

malloc_debug.cppH A D25-Apr-202535.9 KiB1,211926

malloc_debug.hH A D25-Apr-20252.6 KiB6719

README.md

1Malloc 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
7This documentation describes how to enable this feature on Android N or later
8versions of the Android OS. (See the "Examples" section.)
9
10The documentation for malloc debug on older versions of Android is
11[here](README_marshmallow_and_earlier.md).
12
13When malloc debug is enabled, it works by adding a shim layer that replaces
14the normal allocation calls. The replaced calls are:
15
16* `malloc`
17* `free`
18* `calloc`
19* `realloc`
20* `posix_memalign`
21* `memalign`
22* `aligned_alloc`
23* `malloc_usable_size`
24
25On 32 bit systems, these two deprecated functions are also replaced:
26
27* `pvalloc`
28* `valloc`
29
30Any errors detected by the library are reported in the log.
31
32NOTE: 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
39Controlling 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
69    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)
72
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
89    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)
92
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
112Before 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.
115
116As of P, this option will also enable dumping backtrace heap data to a
117file when the process receives the signal SIGRTMAX - 17 ( which is 47 on
118Android 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
127### 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
130SIGRTMAX - 19 (which is 45 on Android devices). When this
131option 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
139Before 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.
142
143### 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
153As 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
155the 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
163### backtrace\_min\_size=ALLOCATION\_SIZE\_BYTES
164As of U, setting this in combination with the backtrace option means
165that only allocations of a size greater than or equal to
166**ALLOCATION\_SIZE\_BYTES** will be backtraced. When used in combination
167with the backtrace\_max\_size option, then allocations greater than or
168equal to backtrace\_min\_size and less than or equal to
169backtrace\_max\_size will be backtraced. The backtrace\_size option
170overrides this option, and should not be used at the same time.
171
172This option can also be used in combination with other tools such
173as [libmemunreachable](https://android.googlesource.com/platform/system/memory/libmemunreachable/+/main/README.md)
174to only get backtraces for sizes of allocations listed as being leaked.
175
176### backtrace\_max\_size=ALLOCATION\_SIZE\_BYTES
177As of U, setting this in combination with the backtrace option means
178that only allocations of a size less than or equal to
179**ALLOCATION\_SIZE\_BYTES** will be backtraced. When used in combination
180with the backtrace\_min\_size option, then allocations greater than or
181equal to backtrace\_min\_size and less than or equal to
182backtrace\_max\_size will be backtraced. The backtrace\_size option
183overrides this option, and should not be used at the same time.
184
185This option can also be used in combination with other tools such
186as [libmemunreachable](https://android.googlesource.com/platform/system/memory/libmemunreachable/+/main/README.md)
187to only get backtraces for sizes of allocations listed as being leaked.
188
189### backtrace\_size=ALLOCATION\_SIZE\_BYTES
190As of U, setting this in combination with the backtrace option means
191that only allocations of size **ALLOCATION\_SIZE\_BYTES** will be backtraced.
192This option overrides the backtrace\_min\_size and the backtrace\_max\_size.
193
194This option can also be used in combination with other tools such
195as [libmemunreachable](https://android.googlesource.com/platform/system/memory/libmemunreachable/+/main/README.md)
196to only get backtraces for sizes of allocations listed as being leaked.
197
198### backtrace\_full
199As of Q, any time that a backtrace is gathered, a different algorithm is used
200that is extra thorough and can unwind through Java frames. This will run
201slower than the normal backtracing function.
202
203### bt, bt\_dmp\_on\_ex, bt\_dmp\_pre, bt\_en\_on\_sig, bt\_full, bt\_max\_sz, bt\_min\_sz, bt\_sz
204As of U, add shorter aliases for backtrace related options to avoid property length restrictions.
205
206| Alias           | Option                        |
207|:----------------|:------------------------------|
208| bt              | backtrace                     |
209| bt\_dmp\_on\_ex | backtrace\_dump\_on\_exit     |
210| bt\_dmp\_pre    | backtrace\_dump\_prefix       |
211| bt\_en\_on\_sig | backtrace\_enable\_on\_signal |
212| bt\_full        | backtrace\_full               |
213| bt\_max\_sz     | backtrace\_max\_size          |
214| bt\_min\_sz     | backtrace\_min\_size          |
215| bt\_sz          | backtrace\_size               |
216
217### check\_unreachable\_on\_signal
218As of Android U, this option will trigger a check for unreachable memory
219in a process. Specifically, if the signal SIGRTMAX - 16 (which is 48 on
220Android devices). The best way to see the exact signal being used is to
221enable the verbose option then look at the log for the message:
222
223    Run: 'kill -48 <PID>' to check for unreachable memory.
224
225When the signal is received, the actual unreachable check only triggers
226on the next allocation that happens in the process (malloc/free, etc).
227
228If a process is not doing any allocations, it can be forced to trigger when
229running:
230
231    debuggerd -b <PID>
232
233**NOTE**: The unreachable check can fail for protected processes, so it
234might be necessary to run:
235
236    setenforce 0
237
238To get the unreachable data.
239
240### fill\_on\_alloc[=MAX\_FILLED\_BYTES]
241Any allocation routine, other than calloc, will result in the allocation being
242filled with the value 0xeb. When doing a realloc to a larger size, the bytes
243above the original usable size will be set to 0xeb.
244
245If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
246of bytes in the allocation. The default is to fill the entire allocation.
247
248### fill\_on\_free[=MAX\_FILLED\_BYTES]
249When an allocation is freed, fill it with 0xef.
250
251If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
252of bytes in the allocation. The default is to fill the entire allocation.
253
254### fill[=MAX\_FILLED\_BYTES]
255This enables both the fill\_on\_alloc option and the fill\_on\_free option.
256
257If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
258of bytes in the allocation. The default is to fill the entire allocation.
259
260### expand\_alloc[=EXPAND\_BYTES]
261Add an extra amount to allocate for every allocation.
262
263If XX is present, it is the number of bytes to expand the allocation by.
264The default is 16 bytes, the max bytes is 16384.
265
266### free\_track[=ALLOCATION\_COUNT]
267When a pointer is freed, do not free the memory right away, but add it to
268a list of freed allocations. In addition to being added to the list, the
269entire allocation is filled with the value 0xef, and the backtrace at
270the time of the free is recorded. The backtrace recording is completely
271separate from the backtrace option, and happens automatically if this
272option is enabled. By default, a maximum of 16 frames will be recorded,
273but this value can be changed using the free\_track\_backtrace\_num\_frames
274option. It can also be completely disabled by setting the option to zero.
275See the full description of this option below.
276
277When the list is full, an allocation is removed from the list and is
278checked to make sure that none of the contents have been modified since
279being placed on the list. When the program terminates, all of the allocations
280left on the list are verified.
281
282If ALLOCATION\_COUNT is present, it indicates the total number of allocations
283in the list. The default is to record 100 freed allocations, the max
284allocations to record is 16384.
285
286Before P, this option adds a special header to all allocations that contains
287the backtrace and information about the original allocation. After that, this
288option will not add a special header.
289
290Example error:
291
292    04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE
293    04-15 12:00:31.305  7412  7412 E malloc_debug:   allocation[20] = 0xaf (expected 0xef)
294    04-15 12:00:31.305  7412  7412 E malloc_debug:   allocation[99] = 0x12 (expected 0xef)
295    04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of free:
296    04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
297    04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
298    04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
299    04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
300
301In addition, there is another type of error message that can occur if
302an allocation has a special header applied, and the header is corrupted
303before the verification occurs. This is the error message that will be found
304in the log:
305
306    04-15 12:00:31.604  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE
307
308### free\_track\_backtrace\_num\_frames[=MAX\_FRAMES]
309This option only has meaning if free\_track is set. It indicates how many
310backtrace frames to capture when an allocation is freed.
311
312If MAX\_FRAMES is present, it indicates the number of frames to capture.
313If the value is set to zero, then no backtrace will be captured when the
314allocation is freed. The default is to record 16 frames, the max number of
315frames to to record is 256.
316
317### leak\_track
318Track all live allocations. When the program terminates, all of the live
319allocations will be dumped to the log. If the backtrace option was enabled,
320then the log will include the backtrace of the leaked allocations. This
321option is not useful when enabled globally because a lot of programs do not
322free everything before the program terminates.
323
324Before P, this option adds a special header to all allocations that contains
325the backtrace and information about the original allocation. After that, this
326option will not add a special header.
327
328Example leak error found in the log:
329
330    04-15 12:35:33.304  7412  7412 E malloc_debug: +++ APP leaked block of size 100 at 0x2be3b0b0 (leak 1 of 2)
331    04-15 12:35:33.304  7412  7412 E malloc_debug: Backtrace at time of allocation:
332    04-15 12:35:33.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
333    04-15 12:35:33.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
334    04-15 12:35:33.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
335    04-15 12:35:33.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
336    04-15 12:35:33.305  7412  7412 E malloc_debug: +++ APP leaked block of size 24 at 0x7be32380 (leak 2 of 2)
337    04-15 12:35:33.305  7412  7412 E malloc_debug: Backtrace at time of allocation:
338    04-15 12:35:33.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
339    04-15 12:35:33.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
340    04-15 12:35:33.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
341    04-15 12:35:33.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
342
343### log\_allocator\_stats\_on\_signal
344As of Android V, this option will trigger a call to:
345
346    mallopt(M_LOG_STATS, 0);
347
348When a process receives the signal SIGRTMAX - 15 (which is 49 on Android
349devices). The mallopt call is not async safe and is not called from the
350signal handler directly. Instead, the next time any allocation call occurs,
351the mallopt is called.
352
353### record\_allocs[=TOTAL\_ENTRIES]
354Keep track of every allocation/free made on every thread and dump them
355to a file when the signal SIGRTMAX - 18 (which is 46 on Android devices)
356is received.
357
358If TOTAL\_ENTRIES is set, then it indicates the total number of
359allocation/free records that can be retained. If the number of records
360reaches the TOTAL\_ENTRIES value, then any further allocations/frees are
361not recorded. The default value is 8,000,000 and the maximum value this
362can be set to is 50,000,000.
363
364Once the signal is received, and the current records are written to the
365file, all current records are deleted. Any allocations/frees occuring while
366the data is being dumped to the file are ignored.
367
368**NOTE**: This option is not available until the O release of Android.
369
370The allocation data is written in a human readable format. Every line begins
371with the THREAD\_ID returned by gettid(), which is the thread that is making
372the allocation/free. If a new thread is created, no special line is added
373to the file. However, when a thread completes, a special entry is added to
374the file indicating this.
375
376The thread complete line is:
377
378**THREAD\_ID**: thread\_done 0x0
379
380Example:
381
382    187: thread_done 0x0
383
384Below is how each type of allocation/free call ends up in the file dump.
385
386pointer = malloc(size)
387
388**THREAD\_ID**: malloc pointer size
389
390Example:
391
392    186: malloc 0xb6038060 20
393
394free(pointer)
395
396**THREAD\_ID**: free pointer
397
398Example:
399
400    186: free 0xb6038060
401
402pointer = calloc(nmemb, size)
403
404**THREAD\_ID**: calloc pointer nmemb size
405
406Example:
407
408    186: calloc 0xb609f080 32 4
409
410new\_pointer = realloc(old\_pointer, size)
411
412**THREAD\_ID**: realloc new\_pointer old\_pointer size
413
414Example:
415
416    186: realloc 0xb609f080 0xb603e9a0 12
417
418pointer = memalign(alignment, size)
419
420**THREAD\_ID**: memalign pointer alignment size
421
422pointer = aligned\_alloc(alignment, size)
423
424**THREAD\_ID**: memalign pointer alignment size
425
426posix\_memalign(&pointer, alignment, size)
427
428**THREAD\_ID**: memalign pointer alignment size
429
430Example:
431
432    186: memalign 0x85423660 16 104
433
434pointer = valloc(size)
435
436**THREAD\_ID**: memalign pointer 4096 size
437
438Example:
439
440    186: memalign 0x85423660 4096 112
441
442pointer = pvalloc(size)
443
444**THREAD\_ID**: memalign pointer 4096 <b>SIZE\_ROUNDED\_UP\_TO\_4096</b>
445
446Example:
447
448    186: memalign 0x85423660 4096 8192
449
450### record\_allocs\_file[=FILE\_NAME]
451This option only has meaning if record\_allocs is set. It indicates the
452file where the recorded allocations will be found.
453
454If FILE\_NAME is set, then it indicates where the record allocation data
455will be placed.
456
457**NOTE**: This option is not available until the O release of Android.
458
459### record\_allocs\_on\_exit
460This option only has meaning if record\_allocs is set. It indicates that
461when the process terminates, the record file should be created
462automatically.
463
464The only caveat to this option is that when the process terminates,
465the file that will contain the records will be the normal file name
466with **.PID** appended. Where PID is the pid of the process that has
467terminated. This is to avoid cases where a number of processes exit
468at the same time and attempt to write to the same file.
469
470**NOTE**: This option is not available until the V release of Android.
471
472### verify\_pointers
473Track all live allocations to determine if a pointer is used that does not
474exist. This option is a lightweight way to verify that all
475free/malloc\_usable\_size/realloc calls are passed valid pointers.
476
477Example error:
478
479    04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 UNKNOWN POINTER (free)
480    04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
481    04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
482    04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
483    04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
484    04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
485
486Where the name of the function varies depending on the function that called
487with a bad pointer. Only three functions do this checking: free,
488malloc\_usable\_size, realloc.
489
490**NOTE**: This option is not available until the P release of Android.
491
492### abort\_on\_error
493When malloc debug detects an error, abort after sending the error
494log message.
495
496**NOTE**: If leak\_track is enabled, no abort occurs if leaks have been
497detected when the process is exiting.
498
499### verbose
500As of Android Q, all info messages will be turned off by default. For example,
501in Android P and older, enabling malloc debug would result in this message
502in the log:
503
504    08-16 15:54:16.060 26947 26947 I libc    : /system/bin/app_process64: malloc debug enabled
505
506In android Q, this message will not be displayed because these info messages
507slow down process start up. However, if you want to re-enable these messages,
508add the verbose option. All of the "Run XXX" messages are also silenced unless
509the verbose option is specified. This is an example of the type
510of messages that are no longer displayed:
511
512    09-10 01:03:50.070   557   557 I malloc_debug: /system/bin/audioserver: Run: 'kill -47 557' to dump the backtrace.
513
514Additional Errors
515-----------------
516There are a few other error messages that might appear in the log.
517
518### Use After Free
519    04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (free)
520    04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace of original free:
521    04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
522    04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
523    04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
524    04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
525    04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
526    04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
527    04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
528    04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
529    04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
530
531This indicates that code is attempting to free an already freed pointer. The
532name in parenthesis indicates that the application called the function
533*free* with the bad pointer.
534
535For example, this message:
536
537    04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (realloc)
538
539Would indicate that the application called the *realloc* function
540with an already freed pointer.
541
542### Invalid Tag
543    04-15 12:00:31.304  7412  7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS INVALID TAG 1ee7d000 (malloc_usable_size)
544    04-15 12:00:31.305  7412  7412 E malloc_debug: Backtrace at time of failure:
545    04-15 12:00:31.305  7412  7412 E malloc_debug:           #00  pc 00029310  /system/lib/libc.so
546    04-15 12:00:31.305  7412  7412 E malloc_debug:           #01  pc 00021438  /system/lib/libc.so (newlocale+160)
547    04-15 12:00:31.305  7412  7412 E malloc_debug:           #02  pc 000a9e38  /system/lib/libc++.so
548    04-15 12:00:31.305  7412  7412 E malloc_debug:           #03  pc 000a28a8  /system/lib/libc++.so
549
550This indicates that a function (malloc\_usable\_size) was called with
551a pointer that is either not allocated memory, or that the memory of
552the pointer has been corrupted.
553
554As with the other error message, the function in parenthesis is the
555function that was called with the bad pointer.
556
557Backtrace Heap Dump Format
558==========================
559
560This section describes the format of the backtrace heap dump. This data is
561generated by am dumpheap -n or, as of P, by the signal or on exit.
562
563The data has this header:
564
565    Android Native Heap Dump v1.0
566
567    Total memory: XXXX
568    Allocation records: YYYY
569    Backtrace size: ZZZZ
570
571Total memory is the total of all of the currently live allocations.
572Allocation records is the total number of allocation records.
573Backtrace size is the maximum number of backtrace frames that can be present.
574
575Following this header are two different sections, the first section is the
576allocation records, the second section is the map data.
577
578The allocation record data has this format:
579
580    z ZYGOTE_CHILD_ALLOC  sz    ALLOCATION_SIZE  num  NUM_ALLOCATIONS bt FRAMES
581
582ZYGOTE\_CHILD\_ALLOC is either 0 or 1. 0 means this was allocated by the
583zygote process or in a process not spawned from the zygote. 1 means this
584was allocated by an application after it forked off from the zygote process.
585
586ALLOCATION\_SIZE is the size of the allocation.
587NUM\_ALLOCATIONS is the number of allocations that have this size and have the
588same backtrace.
589FRAMES is a list of instruction pointers that represent the backtrace of the
590allocation.
591
592Example:
593
594    z 0  sz      400  num    1  bt 0000a230 0000b500
595    z 1  sz      500  num    3  bt 0000b000 0000c000
596
597The first allocation record was created by the zygote of size 400 only one
598with this backtrace/size and a backtrace of 0xa230, 0xb500.
599The second allocation record was create by an application spawned from the
600zygote of size 500, where there are three of these allocation with the same
601backtrace/size and a backtrace of 0xb000, 0xc000.
602
603The final section is the map data for the process:
604
605    MAPS
606    7fe9181000-7fe91a2000 rw-p 00000000 00:00 0                              /system/lib/libc.so
607    .
608    .
609    .
610    END
611
612The map data is simply the output of /proc/PID/maps. This data can be used to
613decode the frames in the backtraces.
614
615There are now multiple versions of the file:
616
617Android P produces version v1.1 of the heap dump.
618
619    Android Native Heap Dump v1.1
620
621The only difference between v1.0 and v1.1 is that the NUM\_ALLOCATIONS
622value is always accurate in v1.1. A previous version of malloc debug set
623NUM\_ALLOCATIONS to an incorrect value. For heap dump v1.0, the
624NUM\_ALLOCATIONS value should be treated as always 1 no matter what is
625actually present.
626
627Android Q introduces v1.2 of the heap dump. The new header looks like this:
628
629    Android Native Heap Dump v1.2
630
631    Build fingerprint: 'google/taimen/taimen:8.1.0/OPM2.171026.006.C1/4769658:user/release-keys'
632
633The new line fingerprint line is the contents of the ro.build.fingerprint
634property.
635
636The new version no longer 0 pads the backtrace addresses. In v1.0/v1.1:
637
638    z 0  sz      400  num    1  bt 0000a230 0000b500
639
640While v1.2:
641
642    z 0  sz      400  num    1  bt a230 b500
643
644In addition, when the new option backtrace\_full is used, another line will
645be added to every backtrace line. The line will be:
646
647      bt_info {"MAP_NAME" RELATIVE_TO_MAP_PC "FUNCTION_NAME" FUNCTION_OFFSET} ...
648
649For each backtrace pc, there will be one element in braces.
650
651MAP\_NAME is the name of the map in which the backtrace pc exists. If there is
652no valid map name, this will be empty.
653RELATIVE\_TO\_MAP\_PC is the hexadecimal value of the relative pc to the map.
654FUNCTION\_NAME the name of the function for this pc. If there is no valid
655function name, then it will be empty.
656FUNCTION\_OFFSET the hexadecimal offset from the beginning of the function. If
657the FUNCTION\_NAME is empty, then this value will always be zero.
658
659An example of this new format:
660
661    z 0  sz      400  num    1  bt a2a0 b510
662      bt_info {"/system/libc.so" 2a0 "abort" 24} {"/system/libutils.so" 510 "" 0}
663
664In this example, the first backtrace frame has a pc of 0xa2a0 and is in the
665map named /system/libc.so which starts at 0xa000. The relative pc is 0x2a0,
666and it is in the function abort + 0x24.
667The second backtrace frame has a pc of 0xb510 and is in the map named
668/system/libutils.so which starts at 0xb000. The relative pc is 0x510 and
669it is in an unknown function.
670
671Examples
672========
673
674### For platform developers
675
676Enable backtrace tracking of all allocation for all processes:
677
678    adb shell stop
679    adb shell setprop libc.debug.malloc.options backtrace
680    adb shell start
681
682Enable backtrace tracking for a specific process (ls):
683
684    adb shell setprop libc.debug.malloc.options backtrace
685    adb shell setprop libc.debug.malloc.program ls
686    adb shell ls
687
688Enable backtrace tracking for the zygote and zygote based processes:
689
690    adb shell stop
691    adb shell setprop libc.debug.malloc.program app_process
692    adb shell setprop libc.debug.malloc.options backtrace
693    adb shell start
694
695Enable multiple options (backtrace and guard):
696
697    adb shell stop
698    adb shell setprop libc.debug.malloc.options "\"backtrace guard\""
699    adb shell start
700
701Note: The two levels of quoting in the adb shell command is necessary.
702The outer layer of quoting is for the shell on the host, to ensure that the
703inner layer of quoting is sent to the device, to make 'backtrace guard'
704a single argument.
705
706Enable malloc debug using an environment variable (pre-O Android release):
707
708    adb shell
709    # setprop libc.debug.malloc.env_enabled 1
710    # setprop libc.debug.malloc.options backtrace
711    # export LIBC_DEBUG_MALLOC_ENABLE=1
712    # ls
713
714Enable malloc debug using an environment variable (Android O or later):
715
716    adb shell
717    # export LIBC_DEBUG_MALLOC_OPTIONS=backtrace
718    # ls
719
720Any process spawned from this shell will run with malloc debug enabled
721using the backtrace option.
722
723    adb shell stop
724    adb shell setprop libc.debug.malloc.options backtrace
725    adb shell start
726    adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt
727
728It is possible to use the backtrace\_enable\_on\_signal option as well,
729but, obviously, it must be enabled through the signal before the file will
730contain any data.
731
732### For app developers
733
734App developers should check the NDK documentation about
735[wrap.sh](https://developer.android.com/ndk/guides/wrap-script.html)
736for the best way to use malloc debug in Android O or later on non-rooted
737devices.
738
739**NOTE**: Android 12 introduced a bug that can cause the wrap.\<APP\> property to
740no longer work. Use the commands below so that the wrap.\<APP\> instructions will work:
741
742    adb shell setprop dalvik.vm.force-java-zygote-fork-loop true
743    adb shell stop
744    adb shell start
745
746If you do have a rooted device, you can enable malloc debug for a specific
747program/application (Android O or later):
748
749    adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
750
751If you need to enable multiple options using this method, then you can set
752them like so:
753
754    adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace\ leak_track\ fill logwrapper"'
755
756For example, to enable malloc debug for the google search box (Android O or later):
757
758    adb shell setprop wrap.com.google.android.googlequicksearchbox '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
759    adb shell am force-stop com.google.android.googlequicksearchbox
760
761If you are setting multiple options and the app does not appear to start
762properly, check the logcat looking for this message
763(`adb logcat -d | grep "malloc debug"`):
764
765    08-16 15:54:16.060 26947 26947 I libc    : /system/bin/app_process64: malloc debug enabled
766
767If you do not see this message, then the wrap property was not set correctly.
768Run:
769
770    adb shell getprop | grep wrap
771
772And verify that any spaces are properly escaped.
773
774NOTE: On pre-O versions of the Android OS, property names had a length limit
775of 32. This meant that to create a wrap property with the name of the app, it
776was necessary to truncate the name to fit. On O, property names can be
777an order of magnitude larger, so there should be no need to truncate the name
778at all.
779
780To detect leaks while an app is running:
781
782    adb shell dumpsys meminfo --unreachable <PID_OF_APP>
783
784Without also enabling malloc debug, this command will only tell
785you whether it can detect leaked memory, not where those leaks are
786occurring. If you enable malloc debug with the backtrace option for your
787app before running the dumpsys command, you'll get backtraces showing
788where the memory was allocated.
789
790For backtraces from your app to be useful, you'll want to keep the
791symbols in your app's shared libraries rather than stripping them. That
792way you'll see the location of the leak directly without having to use
793something like the <code>ndk-stack</code> tool.
794

README_api.md

1Native Memory Tracking using libc Callbacks
2-------------------------------------------
3Malloc debug can be used to get information on all of the live allocations
4in a process. The libc library in Android exports two calls that can be
5used to gather this data from a process. This tracking can be enabled using
6either the backtrace option or the backtrace\_enabled\_on\_signal option.
7
8The 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
13the allocation information.
14*overall\_size* is set to the total size of the buffer returned. If this
15*info\_size*
16value 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
18the point of the function call. This does not include the memory allocated
19by the malloc debug library itself.
20*backtrace\_size* is set to the maximum number of backtrace entries
21that are present for each allocation.
22
23In 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
37The 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
40for all the returned data. The value
41*num\_allocations* contains the total number of allocations with the same
42backtrace and size as this allocation. On Android Nougat, this value was
43incorrectly set to the number of frames in the backtrace.
44Each *uintptr\_t* is a pc of the callstack. If the total number
45of backtrace entries is less than *backtrace\_size*, the rest of the
46entries are zero.
47The calls from within the malloc debug library are automatically removed.
48
49For 32 bit systems, *size\_t* and *uintptr\_t* are both 4 byte values.
50
51For 64 bit systems, *size\_t* and *uintptr\_t* are both 8 byte values.
52
53The total number of these structures returned in *info* is
54*overall\_size* divided by *info\_size*.
55
56Note, the size value in each allocation data structure will have bit 31 set
57if this allocation was created in a process forked from the Zygote process.
58This helps to distinguish between native allocations created by the application.
59

README_marshmallow_and_earlier.md

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