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

Side by Side Diff: tracing/bin/symbolize_trace

Issue 2698543003: Use absolute pcs and load locations to symbolize on macOS. (Closed)
Patch Set: Extract load address of a binary from otool. Created 3 years, 10 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
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2016 The Chromium Authors. All rights reserved. 2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import argparse 6 import argparse
7 import bisect 7 import bisect
8 import collections 8 import collections
9 import gzip 9 import gzip
10 import json 10 import json
11 import os 11 import os
12 import re 12 import re
13 import subprocess 13 import subprocess
14 import sys 14 import sys
15 15
16 _SYMBOLS_PATH = os.path.abspath(os.path.join( 16 _SYMBOLS_PATH = os.path.abspath(os.path.join(
17 os.path.dirname(os.path.realpath(__file__)), 17 os.path.dirname(os.path.realpath(__file__)),
18 '..', 18 '..',
19 'third_party', 19 'third_party',
20 'symbols')) 20 'symbols'))
21 sys.path.append(_SYMBOLS_PATH) 21 sys.path.append(_SYMBOLS_PATH)
22 # pylint: disable=import-error 22 # pylint: disable=import-error
23 import symbols.elf_symbolizer as elf_symbolizer 23 import symbols.elf_symbolizer as elf_symbolizer
24 24
25 import symbolize_trace_atos_regex 25 import symbolize_trace_atos_regex
26 import symbolize_trace_macho_reader
26 27
27 28
28 # Relevant trace event phases from Chromium's 29 # Relevant trace event phases from Chromium's
29 # src/base/trace_event/common/trace_event_common.h. 30 # src/base/trace_event/common/trace_event_common.h.
30 TRACE_EVENT_PHASE_METADATA = 'M' 31 TRACE_EVENT_PHASE_METADATA = 'M'
31 TRACE_EVENT_PHASE_MEMORY_DUMP = 'v' 32 TRACE_EVENT_PHASE_MEMORY_DUMP = 'v'
32 33
33 34
34 # Matches Android library paths, supports both K (/data/app-lib/<>/lib.so) 35 # Matches Android library paths, supports both K (/data/app-lib/<>/lib.so)
35 # as well as L+ (/data/app/<>/lib/<>/lib.so). Library name is available 36 # as well as L+ (/data/app/<>/lib/<>/lib.so). Library name is available
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 symbolizer.SymbolizeAsync(int(address), frames) 89 symbolizer.SymbolizeAsync(int(address), frames)
89 90
90 symbolizer.Join() 91 symbolizer.Join()
91 92
92 def _SymbolizeMac(self, symfile): 93 def _SymbolizeMac(self, symfile):
93 chars_max = int(subprocess.check_output("getconf ARG_MAX", shell=True)) 94 chars_max = int(subprocess.check_output("getconf ARG_MAX", shell=True))
94 95
95 # 16 for the address, 2 for "0x", 1 for the space 96 # 16 for the address, 2 for "0x", 1 for the space
96 chars_per_address = 19 97 chars_per_address = 19
97 98
99 region_start_address = (symbolize_trace_macho_reader.
DmitrySkiba 2017/02/16 21:19:45 Let's call this load_address ?
erikchen 2017/02/16 21:32:18 Done.
100 ReadMachOTextLoadAddress(symfile.symbolizable_path))
101 assert region_start_address is not None
102
98 cmd_base = [self.symbolizer_path, '-arch', 'x86_64', '-l', 103 cmd_base = [self.symbolizer_path, '-arch', 'x86_64', '-l',
99 '0x0', '-o' , symfile.symbolizable_path] 104 '0x%x' % region_start_address, '-o',
105 symfile.symbolizable_path]
100 chars_for_other_arguments = len(' '.join(cmd_base)) + 1 106 chars_for_other_arguments = len(' '.join(cmd_base)) + 1
101 107
102 # The maximum number of inputs that can be processed at once is limited by 108 # The maximum number of inputs that can be processed at once is limited by
103 # ARG_MAX. This currently evalutes to ~13000 on macOS. 109 # ARG_MAX. This currently evalutes to ~13000 on macOS.
104 max_inputs = (chars_max - chars_for_other_arguments) / chars_per_address 110 max_inputs = (chars_max - chars_for_other_arguments) / chars_per_address
105 111
106 all_keys = symfile.frames_by_address.keys() 112 all_keys = symfile.frames_by_address.keys()
107 processed_keys_count = 0 113 processed_keys_count = 0
108 while len(all_keys): 114 while len(all_keys):
109 input_count = min(len(all_keys), max_inputs) 115 input_count = min(len(all_keys), max_inputs)
110 keys_to_process = all_keys[0:input_count] 116 keys_to_process = all_keys[0:input_count]
111 117
112 cmd = list(cmd_base) 118 cmd = list(cmd_base)
113 cmd.extend([hex(int(x)) for x in keys_to_process]) 119 cmd.extend([hex(int(x) + region_start_address)
DmitrySkiba 2017/02/16 21:19:45 This change seems to be noop, why are you making i
erikchen 2017/02/16 21:32:18 I don't understand your question. old code: hex(i
DmitrySkiba 2017/02/16 21:38:48 Oops, sorry, this line is fine. But the next line
erikchen 2017/02/16 21:43:21 previous version exceeded 80 column length
120 for x in keys_to_process])
114 output_array = subprocess.check_output(cmd).split('\n') 121 output_array = subprocess.check_output(cmd).split('\n')
115 for i in range(len(keys_to_process)): 122 for i in range(len(keys_to_process)):
116 for frame in symfile.frames_by_address.values()[i + processed_keys_count ]: 123 for frame in (symfile.frames_by_address.values()
124 [i + processed_keys_count]):
117 frame.name = self._matcher.Match(output_array[i]) 125 frame.name = self._matcher.Match(output_array[i])
118 processed_keys_count += len(keys_to_process) 126 processed_keys_count += len(keys_to_process)
119 all_keys = all_keys[input_count:] 127 all_keys = all_keys[input_count:]
120 128
121 def Symbolize(self, symfile): 129 def Symbolize(self, symfile):
122 if self.is_mac: 130 if self.is_mac:
123 self._SymbolizeMac(symfile) 131 self._SymbolizeMac(symfile)
124 else: 132 else:
125 self._SymbolizeLinuxAndAndroid(symfile) 133 self._SymbolizeLinuxAndAndroid(symfile)
126 134
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 461
454 print 'Updating trace file...' 462 print 'Updating trace file...'
455 with _OpenTraceFile('w') as trace_file: 463 with _OpenTraceFile('w') as trace_file:
456 json.dump(trace, trace_file) 464 json.dump(trace, trace_file)
457 else: 465 else:
458 print 'No PCs symbolized - not updating trace file.' 466 print 'No PCs symbolized - not updating trace file.'
459 467
460 468
461 if __name__ == '__main__': 469 if __name__ == '__main__':
462 main() 470 main()
OLDNEW
« no previous file with comments | « no previous file | tracing/bin/symbolize_trace_macho_reader.py » ('j') | tracing/bin/symbolize_trace_macho_reader.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698