Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 """A tool to deobfuscate Java stack traces. | 6 """A tool to deobfuscate Java stack traces. |
| 7 | 7 |
| 8 Utility wrapper around ReTrace to deobfuscate stack traces that have been | 8 Utility wrapper around ReTrace to deobfuscate stack traces that have been |
| 9 mangled by ProGuard. Takes stack traces from stdin (eg. adb logcat | | 9 mangled by ProGuard. Takes stack traces from stdin (eg. adb logcat | |
| 10 java_deobfuscate.py proguard.mapping) and files. | 10 java_deobfuscate.py proguard.mapping) and files. |
| 11 """ | 11 """ |
| 12 | 12 |
| 13 # Can just run: | |
| 14 # java -jar third_party/proguard/lib/retrace.jar -regex \ | |
| 15 # "(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|(?:(?:.*?[:\"]\s+)?%c(?::.*)?)" \ | |
| 16 # ~/mapping | |
| 17 # in terminal to achieve same effect as this tool. | |
| 18 | |
| 19 import argparse | 13 import argparse |
| 20 import os | 14 import os |
| 21 import subprocess | |
| 22 import sys | |
| 23 | 15 |
| 24 _THIRD_PARTY_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), | 16 _SRC_DIR = os.path.normpath( |
| 25 os.pardir, os.pardir, os.pardir, | 17 os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)) |
| 26 'third_party')) | |
| 27 sys.path.append(os.path.join(_THIRD_PARTY_DIR, 'catapult', 'devil')) | |
| 28 from devil.utils import cmd_helper | |
| 29 | 18 |
| 30 | 19 # This regex is based on the one from: |
| 31 # This regex is taken from | |
| 32 # http://proguard.sourceforge.net/manual/retrace/usage.html. | 20 # http://proguard.sourceforge.net/manual/retrace/usage.html. |
| 21 # But with the "at" part changed to "(?::|\bat)", to account for lines like: | |
|
mikecase (-- gone --)
2017/06/22 20:34:16
Do you have an example of the type of lines this n
agrieve
2017/06/23 01:48:22
Done.
| |
| 22 # 06-22 13:58:02.895 4674 4674 E THREAD_STATE: bLA.a(PG:173) | |
| 33 _LINE_PARSE_REGEX = ( | 23 _LINE_PARSE_REGEX = ( |
| 34 r'(?:.*?\bat\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)') | 24 r'(?:.*?(?::|\bat)\s+%c\.%m\s*\(%s(?::%l)?\)\s*)|' |
| 25 r'(?:(?:.*?[:"]\s+)?%c(?::.*)?)') | |
| 35 | 26 |
| 36 | 27 |
| 37 def main(): | 28 def main(): |
| 38 parser = argparse.ArgumentParser(description=(__doc__)) | 29 parser = argparse.ArgumentParser(description=(__doc__)) |
| 39 parser.add_argument( | 30 parser.add_argument( |
| 40 'mapping_file', | 31 'mapping_file', |
| 41 help='ProGuard mapping file from build which the stacktrace is from.') | 32 help='ProGuard mapping file from build which the stacktrace is from.') |
| 42 parser.add_argument( | 33 parser.add_argument( |
| 43 '--stacktrace', | 34 '--stacktrace', |
| 44 help='Stacktrace file to be deobfuscated.') | 35 help='Stacktrace file to be deobfuscated.') |
| 45 args = parser.parse_args() | 36 args = parser.parse_args() |
| 46 | 37 |
| 47 retrace_path = os.path.join(_THIRD_PARTY_DIR, 'proguard', | 38 retrace_path = os.path.join( |
| 48 'lib', 'retrace.jar') | 39 _SRC_DIR, 'third_party', 'proguard', 'lib', 'retrace.jar') |
| 49 | 40 |
| 50 base_args = ['java', '-jar', retrace_path, '-regex', _LINE_PARSE_REGEX, | 41 cmd = ['java', '-jar', retrace_path, '-regex', _LINE_PARSE_REGEX, |
| 51 args.mapping_file] | 42 args.mapping_file] |
| 52 if args.stacktrace: | 43 if args.stacktrace: |
| 53 subprocess.call(base_args + [args.stacktrace]) | 44 cmd.append(args.stacktrace) |
| 54 else: | 45 os.execvp('java', cmd) |
| 55 for line in cmd_helper.IterCmdOutputLines(base_args): | |
| 56 print line | |
| 57 | 46 |
| 58 | 47 |
| 59 if __name__ == '__main__': | 48 if __name__ == '__main__': |
| 60 main() | 49 main() |
| OLD | NEW |