| Index: base/trace_event/process_memory_dump.cc
|
| diff --git a/base/trace_event/process_memory_dump.cc b/base/trace_event/process_memory_dump.cc
|
| index 2fbe531d551ab64cd1035c7b0c3ab7aeb9351f98..74cbcc29a0320ac113af1c03bb9cf8fb6d07a30e 100644
|
| --- a/base/trace_event/process_memory_dump.cc
|
| +++ b/base/trace_event/process_memory_dump.cc
|
| @@ -12,6 +12,10 @@
|
| #include "base/trace_event/trace_event_argument.h"
|
| #include "build/build_config.h"
|
|
|
| +#if defined(OS_IOS)
|
| +#include <sys/sysctl.h>
|
| +#endif
|
| +
|
| #if defined(OS_POSIX)
|
| #include <sys/mman.h>
|
| #endif
|
| @@ -42,9 +46,28 @@ size_t GetSystemPageCount(size_t mapped_size, size_t page_size) {
|
|
|
| #if defined(COUNT_RESIDENT_BYTES_SUPPORTED)
|
| // static
|
| +size_t ProcessMemoryDump::GetSystemPageSize() {
|
| +#if defined(OS_IOS)
|
| + // On iOS, getpagesize() returns the user page sizes, but for allocating
|
| + // arrays for mincore(), kernel page sizes is needed. sysctlbyname() should
|
| + // be used for this. Refer to crbug.com/542671 and Apple rdar://23651782
|
| + int pagesize;
|
| + size_t pagesize_len;
|
| + int status = sysctlbyname("vm.pagesize", NULL, &pagesize_len, nullptr, 0);
|
| + if (!status && pagesize_len == sizeof(pagesize)) {
|
| + if (!sysctlbyname("vm.pagesize", &pagesize, &pagesize_len, nullptr, 0))
|
| + return pagesize;
|
| + }
|
| + LOG(ERROR) << "sysctlbyname(\"vm.pagesize\") failed.";
|
| + // Falls back to getpagesize() although it may be wrong in certain cases.
|
| +#endif // defined(OS_IOS)
|
| + return base::GetPageSize();
|
| +}
|
| +
|
| +// static
|
| size_t ProcessMemoryDump::CountResidentBytes(void* start_address,
|
| size_t mapped_size) {
|
| - const size_t page_size = GetPageSize();
|
| + const size_t page_size = GetSystemPageSize();
|
| const uintptr_t start_pointer = reinterpret_cast<uintptr_t>(start_address);
|
| DCHECK_EQ(0u, start_pointer % page_size);
|
|
|
|
|