Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: base/debug/proc_maps.cc

Issue 18178015: Implement /proc/self/maps/ parsing code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/debug/proc_maps.h"
6
7 #include <inttypes.h>
8
9 #include "base/file_util.h"
10 #include "base/strings/string_split.h"
11
12 namespace base {
13 namespace debug {
14
15 #if defined(OS_LINUX) || defined(OS_ANDROID)
16
17 std::string ReadProcMaps() {
18 std::string proc_maps;
19 FilePath proc_maps_path("/proc/self/maps");
20 if (!file_util::ReadFileToString(proc_maps_path, &proc_maps))
21 proc_maps.clear();
22 return proc_maps;
23 }
24
25 void ParseProcMaps(const std::string& input,
26 std::vector<MappedMemoryRegion>* regions) {
27 // Sample format from man 5 proc:
28 //
29 // address perms offset dev inode pathname
30 // 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
31 //
32 // The final %n term captures the offset in the input string, which is used
33 // to determine the path name.
34 static const char kProcMapFormat[] =
satorux1 2013/07/01 03:59:56 remove static? function-local 'static' is not guar
scherkus (not reviewing) 2013/07/01 21:59:45 Done.
35 "%" SCNxPTR "-%" SCNxPTR " %*s %zx %*x:%*x %*d %n";
satorux1 2013/07/01 03:59:56 didn't know about SCNxPTR. :)
scherkus (not reviewing) 2013/07/01 21:59:45 yeah I didn't either until I starting looking thro
36
37 regions->clear();
38
39 // This isn't async safe nor terribly efficient, but it doesn't need to be at
40 // this point in time.
41 std::vector<std::string> lines;
42 SplitString(input, '\n', &lines);
43
44 for (size_t i = 0; i < lines.size(); ++i) {
45 const char* line = lines[i].c_str();
46 uintptr_t start = 0;
47 uintptr_t end = 0;
48 size_t offset = 0;
49 int path_index = 0;
50
51 if (sscanf(line, kProcMapFormat, &start, &end, &offset, &path_index) < 3)
52 continue;
53
54 MappedMemoryRegion region;
55 region.start = start;
56 region.end = end;
57 region.offset = offset;
58 region.path = FilePath(line + path_index);
59 regions->push_back(region);
60 }
61 }
62
63 #endif
64
65 } // namespace debug
66 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698