Index: tools/valgrind/asan/asan_symbolize.py |
diff --git a/tools/valgrind/asan/asan_symbolize.py b/tools/valgrind/asan/asan_symbolize.py |
index ba8d69859fdb290451c6d1d1f931520004e1f316..ec70979316837031bc798dc067b5a2f0eabcc852 100755 |
--- a/tools/valgrind/asan/asan_symbolize.py |
+++ b/tools/valgrind/asan/asan_symbolize.py |
@@ -45,13 +45,50 @@ def set_symbolizer_path(): |
os.environ['LLVM_SYMBOLIZER_PATH'] = os.path.abspath(symbolizer_path) |
+def split_path(path): |
+ parts = [] |
+ while True: |
+ path, tail = os.path.split(path) |
+ if tail: |
+ parts.insert(0, tail) |
+ else: |
+ parts.insert(0, path) |
+ break |
+ return parts |
+ |
+def chrome_dsym_hints(binary): |
+ parts = split_path(binary) |
+ app_pos = -1 |
+ framework_pos = -1 |
+ for index in range(len(parts)): |
+ part = parts[index] |
+ if app_pos == -1 and part.endswith('.app'): |
+ app_pos = index |
+ if framework_pos == -1 and part.endswith('.framework'): |
+ framework_pos = index |
+ if framework_pos < 0: |
+ if app_pos < 0: |
+ return [] |
+ else: |
+ parts = parts[:app_pos + 1] |
+ else: |
+ if app_pos > 0: |
+ assert(app_pos < framework_pos) |
+ parts[app_pos] = parts[framework_pos] |
+ parts = parts[:app_pos + 1] |
+ else: |
+ parts = parts[:framework_pos + 1] |
+ result = '%s.dSYM' % reduce(os.path.join, parts) |
+ return [result] |
+ |
+ |
def main(): |
disable_buffering() |
set_symbolizer_path() |
asan_symbolize.demangle = True |
asan_symbolize.fix_filename_patterns = sys.argv[1:] |
asan_symbolize.logfile = sys.stdin |
- loop = asan_symbolize.SymbolizationLoop() |
+ loop = asan_symbolize.SymbolizationLoop(dsym_hint_producer=chrome_dsym_hints) |
loop.process_logfile() |
if __name__ == '__main__': |