Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // --- | 5 // --- |
| 6 // Author: Sainbayar Sukhbaatar | 6 // Author: Sainbayar Sukhbaatar |
| 7 // Dai Mikurube | 7 // Dai Mikurube |
| 8 // | 8 // |
| 9 | 9 |
| 10 #include "deep-heap-profile.h" | 10 #include "deep-heap-profile.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 | 84 |
| 85 for (int i = 0; i < kHashTableSize; i++) { | 85 for (int i = 0; i < kHashTableSize; i++) { |
| 86 for (DeepBucket* deep_bucket = deep_table_[i]; | 86 for (DeepBucket* deep_bucket = deep_table_[i]; |
| 87 deep_bucket != NULL; | 87 deep_bucket != NULL; |
| 88 deep_bucket = deep_bucket->next) { | 88 deep_bucket = deep_bucket->next) { |
| 89 deep_bucket->is_logged = false; | 89 deep_bucket->is_logged = false; |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 | 92 |
| 93 // Write maps into a .maps file with using the global buffer. | 93 // Write maps into a .maps file with using the global buffer. |
| 94 WriteMapsToFile(filename_prefix_, kProfilerBufferSize, profiler_buffer_); | 94 WriteMapsToFile(filename_prefix_, 0, |
|
Alexander Potapenko
2012/08/14 08:39:57
Why is this 0?
If the process didn't call exec() y
Dai Mikurube (NOT FULLTIME)
2012/08/14 09:33:26
Data in /proc/<pid>/maps is used in this dumper "d
Alexander Potapenko
2012/08/14 09:36:47
Can you please prepend a comment to "0" so that th
| |
| 95 kProfilerBufferSize, profiler_buffer_); | |
| 95 } | 96 } |
| 97 WriteMapsToFile(filename_prefix_, dump_count_, | |
|
Alexander Potapenko
2012/08/14 08:39:57
Are you going to write the mappings twice if most_
Dai Mikurube (NOT FULLTIME)
2012/08/14 09:33:26
Yes, I know normally "prefix.<pid>.maps" and "pref
| |
| 98 kProfilerBufferSize, profiler_buffer_); | |
| 96 | 99 |
| 97 // Reset committed sizes of buckets. | 100 // Reset committed sizes of buckets. |
| 98 ResetCommittedSize(deep_table_); | 101 ResetCommittedSize(deep_table_); |
| 99 | 102 |
| 100 // Allocate a list for mmap'ed regions. | 103 // Allocate a list for mmap'ed regions. |
| 101 num_mmap_allocations_ = 0; | 104 num_mmap_allocations_ = 0; |
| 102 heap_profile_->mmap_address_map_->Iterate(CountMMap, this); | 105 heap_profile_->mmap_address_map_->Iterate(CountMMap, this); |
| 103 mmap_list_length_ = 0; | 106 mmap_list_length_ = 0; |
| 104 mmap_list_ = reinterpret_cast<MMapListEntry*>(heap_profile_->alloc_( | 107 mmap_list_ = reinterpret_cast<MMapListEntry*>(heap_profile_->alloc_( |
| 105 sizeof(MMapListEntry) * num_mmap_allocations_)); | 108 sizeof(MMapListEntry) * num_mmap_allocations_)); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 316 break; | 319 break; |
| 317 } | 320 } |
| 318 page_address += page_size; | 321 page_address += page_size; |
| 319 } | 322 } |
| 320 | 323 |
| 321 return committed_size; | 324 return committed_size; |
| 322 } | 325 } |
| 323 | 326 |
| 324 // static | 327 // static |
| 325 void DeepHeapProfile::WriteMapsToFile(const char* filename_prefix, | 328 void DeepHeapProfile::WriteMapsToFile(const char* filename_prefix, |
| 329 unsigned count, | |
| 326 int buffer_size, | 330 int buffer_size, |
| 327 char buffer[]) { | 331 char buffer[]) { |
| 328 char filename[100]; | 332 char filename[100]; |
| 329 snprintf(filename, sizeof(filename), | 333 if (count > 0) { |
| 330 "%s.%05d.maps", filename_prefix, static_cast<int>(getpid())); | 334 snprintf(filename, sizeof(filename), |
| 335 "%s.%05d.%04d.maps", filename_prefix, static_cast<int>(getpid()), | |
| 336 count); | |
| 337 } else { | |
| 338 snprintf(filename, sizeof(filename), | |
| 339 "%s.%05d.maps", filename_prefix, static_cast<int>(getpid())); | |
| 340 } | |
| 331 | 341 |
| 332 RawFD maps_fd = RawOpenForWriting(filename); | 342 RawFD maps_fd = RawOpenForWriting(filename); |
| 333 RAW_DCHECK(maps_fd != kIllegalRawFD, ""); | 343 RAW_DCHECK(maps_fd != kIllegalRawFD, ""); |
| 334 | 344 |
| 335 int map_length; | 345 int map_length; |
| 336 bool wrote_all; | 346 bool wrote_all; |
| 337 map_length = tcmalloc::FillProcSelfMaps(buffer, buffer_size, &wrote_all); | 347 map_length = tcmalloc::FillProcSelfMaps(buffer, buffer_size, &wrote_all); |
| 338 RAW_DCHECK(wrote_all, ""); | 348 RAW_DCHECK(wrote_all, ""); |
| 339 RAW_DCHECK(map_length <= buffer_size, ""); | 349 RAW_DCHECK(map_length <= buffer_size, ""); |
| 340 RawWrite(maps_fd, buffer, map_length); | 350 RawWrite(maps_fd, buffer, map_length); |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 807 } | 817 } |
| 808 | 818 |
| 809 DeepHeapProfile::~DeepHeapProfile() { | 819 DeepHeapProfile::~DeepHeapProfile() { |
| 810 } | 820 } |
| 811 | 821 |
| 812 int DeepHeapProfile::FillOrderedProfile(char buffer[], int buffer_size) { | 822 int DeepHeapProfile::FillOrderedProfile(char buffer[], int buffer_size) { |
| 813 return heap_profile_->FillOrderedProfile(buffer, buffer_size); | 823 return heap_profile_->FillOrderedProfile(buffer, buffer_size); |
| 814 } | 824 } |
| 815 | 825 |
| 816 #endif // DEEP_HEAP_PROFILE | 826 #endif // DEEP_HEAP_PROFILE |
| OLD | NEW |