summaryrefslogtreecommitdiffstats
path: root/tools/find_runtime_symbols/prepare_symbol_info.py
diff options
context:
space:
mode:
authordmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-30 06:39:08 +0000
committerdmikurube@chromium.org <dmikurube@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-30 06:39:08 +0000
commit1318f78c068f52e32777fb5cb6551ea3001ee1d9 (patch)
tree371ad2360f34c14271506a1ca85bb2fe61aa6339 /tools/find_runtime_symbols/prepare_symbol_info.py
parent28a6e8d92da4428482e9145d0dc01907fc86bcd4 (diff)
downloadchromium_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-xtools/find_runtime_symbols/prepare_symbol_info.py82
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))