blob: b2c46d85c5e9bd32673daa0a01d7c478dea0b8ae [file] [log] [blame] [view]
Christopher Ferris713a8e32016-03-18 14:29:51 -07001Native 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
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070010`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);`
Christopher Ferris713a8e32016-03-18 14:29:51 -070011
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070012*info* is set to a buffer allocated by the call that contains all of
Christopher Ferris713a8e32016-03-18 14:29:51 -070013the allocation information.
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070014*overall\_size* is set to the total size of the buffer returned. If this
15*info\_size*
Christopher Ferris713a8e32016-03-18 14:29:51 -070016value is zero, then there are no allocation being tracked.
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070017*total\_memory* is set to the sum of all allocation sizes that are live at
Christopher Ferris713a8e32016-03-18 14:29:51 -070018the point of the function call. This does not include the memory allocated
19by the malloc debug library itself.
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070020*backtrace\_size* is set to the maximum number of backtrace entries
Christopher Ferris713a8e32016-03-18 14:29:51 -070021that are present for each allocation.
22
23In order to free the buffer allocated by the function, call:
24
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070025`extern "C" void free_malloc_leak_info(uint8_t* info);`
Christopher Ferris713a8e32016-03-18 14:29:51 -070026
27### Format of info Buffer
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070028 size_t size_of_original_allocation
Christopher Ferris426b00a2017-03-09 13:47:37 -080029 size_t num_allocations
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070030 uintptr_t pc1
31 uintptr_t pc2
32 uintptr_t pc3
33 .
34 .
35 .
Christopher Ferris713a8e32016-03-18 14:29:51 -070036
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070037The 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
Christopher Ferris713a8e32016-03-18 14:29:51 -070040for all the returned data. The value
Christopher Ferris426b00a2017-03-09 13:47:37 -080041*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.
Christopher Ferris713a8e32016-03-18 14:29:51 -070047The calls from within the malloc debug library are automatically removed.
48
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070049For 32 bit systems, *size\_t* and *uintptr\_t* are both 4 byte values.
Christopher Ferris713a8e32016-03-18 14:29:51 -070050
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070051For 64 bit systems, *size\_t* and *uintptr\_t* are both 8 byte values.
Christopher Ferris713a8e32016-03-18 14:29:51 -070052
Christopher Ferrisc7bfe2e2016-04-26 16:07:29 -070053The total number of these structures returned in *info* is
54*overall\_size* divided by *info\_size*.
Christopher Ferris713a8e32016-03-18 14:29:51 -070055
56Note, the size value in each allocation data structure will have bit 31 set
Christopher Ferrisac66d162016-09-28 14:51:12 -070057if this allocation was created in a process forked from the Zygote process.
58This helps to distinguish between native allocations created by the application.