| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 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 | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """A tool to deobfuscate Java stack traces. | |
| 7 | |
| 8 Utility wrapper around ReTrace to deobfuscate stack traces that have been | |
| 9 mangled by ProGuard. Takes stack traces from stdin (eg. adb logcat | | |
| 10 java_deobfuscate.py proguard.mapping) and files. | |
| 11 """ | |
| 12 | |
| 13 import argparse | |
| 14 import os | |
| 15 | |
| 16 _SRC_DIR = os.path.normpath( | |
| 17 os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)) | |
| 18 | |
| 19 # This regex is based on the one from: | |
| 20 # http://proguard.sourceforge.net/manual/retrace/usage.html. | |
| 21 # But with the "at" part changed to "(?::|\bat)", to account for lines like: | |
| 22 # 06-22 13:58:02.895 4674 4674 E THREAD_STATE: bLA.a(PG:173) | |
| 23 # Normal stack trace lines look like: | |
| 24 # java.lang.RuntimeException: Intentional Java Crash | |
| 25 # at org.chromium.chrome.browser.tab.Tab.handleJavaCrash(Tab.java:682) | |
| 26 # at org.chromium.chrome.browser.tab.Tab.loadUrl(Tab.java:644) | |
| 27 _LINE_PARSE_REGEX = ( | |
| 28 r'(?:.*?(?::|\bat)\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|' | |
| 29 r'(?:(?:.*?[:"]\s+)?%c(?::.*)?)') | |
| 30 | |
| 31 | |
| 32 def main(): | |
| 33 parser = argparse.ArgumentParser(description=(__doc__)) | |
| 34 parser.add_argument( | |
| 35 'mapping_file', | |
| 36 help='ProGuard mapping file from build which the stacktrace is from.') | |
| 37 parser.add_argument( | |
| 38 '--stacktrace', | |
| 39 help='Stacktrace file to be deobfuscated.') | |
| 40 args = parser.parse_args() | |
| 41 | |
| 42 retrace_path = os.path.join( | |
| 43 _SRC_DIR, 'third_party', 'proguard', 'lib', 'retrace.jar') | |
| 44 | |
| 45 cmd = ['java', '-jar', retrace_path, '-regex', _LINE_PARSE_REGEX, | |
| 46 args.mapping_file] | |
| 47 if args.stacktrace: | |
| 48 cmd.append(args.stacktrace) | |
| 49 os.execvp('java', cmd) | |
| 50 | |
| 51 | |
| 52 if __name__ == '__main__': | |
| 53 main() | |
| OLD | NEW |