diff options
author | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-30 06:39:08 +0000 |
---|---|---|
committer | dmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-30 06:39:08 +0000 |
commit | 1318f78c068f52e32777fb5cb6551ea3001ee1d9 (patch) | |
tree | 371ad2360f34c14271506a1ca85bb2fe61aa6339 /tools/find_runtime_symbols/prepare_symbol_info.py | |
parent | 28a6e8d92da4428482e9145d0dc01907fc86bcd4 (diff) | |
download | chromium_src-1318f78c068f52e32777fb5cb6551ea3001ee1d9.zip chromium_src-1318f78c068f52e32777fb5cb6551ea3001ee1d9.tar.gz chromium_src-1318f78c068f52e32777fb5cb6551ea3001ee1d9.tar.bz2 |
Load static symbol information lazily with some clean-ups.
It also changes :
- dmprof messages,
- how to run subprocesses in prepare_symbol_info,
- to prepare readelf result in prepare_symbol_info,
- to rename procedure_boundaries => static_symbols,
- how to parse nm results in static_symbols,
- additional --keep option,
- to ignore empty files, and
- to store addresses in int.
BUG=123749
TEST=use dmprof.
Review URL: https://chromiumcodereview.appspot.com/10826008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@148930 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/find_runtime_symbols/prepare_symbol_info.py')
-rwxr-xr-x | tools/find_runtime_symbols/prepare_symbol_info.py | 82 |
1 files changed, 52 insertions, 30 deletions
diff --git a/tools/find_runtime_symbols/prepare_symbol_info.py b/tools/find_runtime_symbols/prepare_symbol_info.py index 57fcfbc..50654b1a 100755 --- a/tools/find_runtime_symbols/prepare_symbol_info.py +++ b/tools/find_runtime_symbols/prepare_symbol_info.py @@ -16,6 +16,39 @@ from parse_proc_maps import parse_proc_maps from util import executable_condition +def _dump_command_result(command, output_dir_path, basename, suffix, log): + handle_out, filename_out = tempfile.mkstemp( + suffix=suffix, prefix=basename + '.', dir=output_dir_path) + handle_err, filename_err = tempfile.mkstemp( + suffix=suffix + '.err', prefix=basename + '.', dir=output_dir_path) + error = False + try: + subprocess.check_call( + command, stdout=handle_out, stderr=handle_err, shell=True) + except: + error = True + finally: + os.close(handle_err) + os.close(handle_out) + + if os.path.exists(filename_err): + if log.getEffectiveLevel() <= logging.DEBUG: + with open(filename_err, 'r') as f: + for line in f: + log.debug(line.rstrip()) + os.remove(filename_err) + + if os.path.exists(filename_out) and ( + os.path.getsize(filename_out) == 0 or error): + os.remove(filename_out) + return None + + if not os.path.exists(filename_out): + return None + + return filename_out + + def prepare_symbol_info(maps_path, output_dir_path=None, loglevel=logging.WARN): log = logging.getLogger('prepare_symbol_info') log.setLevel(loglevel) @@ -58,42 +91,31 @@ def prepare_symbol_info(maps_path, output_dir_path=None, loglevel=logging.WARN): maps = parse_proc_maps(f) log.debug('Listing up symbols.') - nm_files = {} + files = {} for entry in maps.iter(executable_condition): log.debug(' %016x-%016x +%06x %s' % ( entry.begin, entry.end, entry.offset, entry.name)) - with tempfile.NamedTemporaryFile( - prefix=os.path.basename(entry.name) + '.', - suffix='.nm', delete=False, mode='w', dir=output_dir_path) as f: - nm_filename = os.path.realpath(f.name) - nm_succeeded = False - cppfilt_succeeded = False - p_nm = subprocess.Popen( - 'nm -n --format bsd %s' % entry.name, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - p_cppfilt = subprocess.Popen( - 'c++filt', shell=True, - stdin=p_nm.stdout, stdout=f, stderr=subprocess.PIPE) - - if p_nm.wait() == 0: - nm_succeeded = True - for line in p_nm.stderr: - log.debug(line.rstrip()) - if p_cppfilt.wait() == 0: - cppfilt_succeeded = True - for line in p_cppfilt.stderr: - log.debug(line.rstrip()) - - if nm_succeeded and cppfilt_succeeded: - nm_files[entry.name] = { + nm_filename = _dump_command_result( + 'nm -n --format bsd %s | c++filt' % entry.name, + output_dir_path, os.path.basename(entry.name), '.nm', log) + if not nm_filename: + continue + readelf_e_filename = _dump_command_result( + 'readelf -e %s' % entry.name, + output_dir_path, os.path.basename(entry.name), '.readelf-e', log) + if not readelf_e_filename: + continue + + files[entry.name] = {} + files[entry.name]['nm'] = { 'file': os.path.basename(nm_filename), 'format': 'bsd', 'mangled': False} - else: - os.remove(nm_filename) + files[entry.name]['readelf-e'] = { + 'file': os.path.basename(readelf_e_filename)} - with open(os.path.join(output_dir_path, 'nm.json'), 'w') as f: - json.dump(nm_files, f, indent=2, sort_keys=True) + with open(os.path.join(output_dir_path, 'files.json'), 'w') as f: + json.dump(files, f, indent=2, sort_keys=True) log.info('Collected symbol information at "%s".' % output_dir_path) return 0 @@ -110,7 +132,7 @@ def main(): """ % sys.argv[0]) return 1 elif len(sys.argv) == 2: - sys.exit(prepare_symbol_info(sys.argv[1], loglevel=logging.DEBUG)) + sys.exit(prepare_symbol_info(sys.argv[1], loglevel=logging.INFO)) else: sys.exit(prepare_symbol_info(sys.argv[1], sys.argv[2], loglevel=logging.INFO)) |