Index: base/trace_event/process_memory_maps_dump_provider.cc |
diff --git a/base/trace_event/process_memory_maps_dump_provider.cc b/base/trace_event/process_memory_maps_dump_provider.cc |
index fbe0eb1e8c32db46bffdd08cfaba96c32eb3087c..d728bd3780b3b27b7a0559cc7c5954fc0712cc45 100644 |
--- a/base/trace_event/process_memory_maps_dump_provider.cc |
+++ b/base/trace_event/process_memory_maps_dump_provider.cc |
@@ -60,7 +60,7 @@ bool ParseSmapsHeader(std::istream* smaps, |
region->protection_flags |= |
ProcessMemoryMaps::VMRegion::kProtectionFlagsExec; |
} |
- *smaps >> std::hex >> region->mapped_file_offset; |
+ *smaps >> ignored; // Ignore mapped file offset. |
*smaps >> ignored; // Ignore device maj-min (fc:01 in the example above). |
*smaps >> ignored; // Ignore inode number (1234 in the example above). |
@@ -73,9 +73,15 @@ bool ParseSmapsHeader(std::istream* smaps, |
return res; |
} |
+uint64 ReadCounterBytes(std::istream* smaps) { |
+ uint64 counter_value = 0; |
+ *smaps >> std::dec >> counter_value; |
+ return counter_value * 1024; |
+} |
+ |
uint32 ParseSmapsCounter(std::istream* smaps, |
ProcessMemoryMaps::VMRegion* region) { |
- // e.g., "RSS: 0 Kb\n" |
+ // A smaps counter lines looks as follows: "RSS: 0 Kb\n" |
uint32 res = 0; |
std::string counter_name; |
*smaps >> counter_name; |
@@ -83,13 +89,17 @@ uint32 ParseSmapsCounter(std::istream* smaps, |
// TODO(primiano): "Swap" should also be accounted as resident. Check |
// whether Rss isn't already counting swapped and fix below if that is |
// the case. |
- if (counter_name == "Rss:") { |
- *smaps >> std::dec >> region->byte_stats_resident; |
- region->byte_stats_resident *= 1024; |
+ if (counter_name == "Pss:") { |
+ region->byte_stats_proportional_resident = ReadCounterBytes(smaps); |
+ res = 1; |
+ } else if (counter_name == "Private_Dirty:" || |
+ counter_name == "Private_Clean:") { |
+ // For Private and Shared counters keep the sum of the dirty + clean stats. |
+ region->byte_stats_private_resident += ReadCounterBytes(smaps); |
res = 1; |
- } else if (counter_name == "Anonymous:") { |
- *smaps >> std::dec >> region->byte_stats_anonymous; |
- region->byte_stats_anonymous *= 1024; |
+ } else if (counter_name == "Shared_Dirty:" || |
+ counter_name == "Shared_Clean:") { |
+ region->byte_stats_shared_resident += ReadCounterBytes(smaps); |
res = 1; |
} |
@@ -111,7 +121,7 @@ uint32 ReadLinuxProcSmapsFile(std::istream* smaps, ProcessMemoryMaps* pmm) { |
if (!smaps->good()) |
return 0; |
- const uint32 kNumExpectedCountersPerRegion = 2; |
+ const uint32 kNumExpectedCountersPerRegion = 5; |
uint32 counters_parsed_for_current_region = 0; |
uint32 num_valid_regions = 0; |
ProcessMemoryMaps::VMRegion region; |