| #!/usr/bin/env python3 | |
| # | |
| # Copyright (C) 2013 The Android Open Source Project | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """stack symbolizes native crash dumps.""" | |
| import argparse | |
| import atexit | |
| import glob | |
| import sys | |
| import tempfile | |
| import zipfile | |
| import stack_core | |
| import symbol | |
| def main(): | |
| parser = argparse.ArgumentParser(description='Parse and symbolize crashes') | |
| parser.add_argument('--arch', help='the target architecture') | |
| group = parser.add_mutually_exclusive_group() | |
| group.add_argument('--symbols-dir', '--syms', '--symdir', help='the symbols directory') | |
| group.add_argument('--symbols-zip', help='the symbols.zip file from a build') | |
| parser.add_argument('-v', '--verbose', action='store_true', help="include function parameters") | |
| parser.add_argument('file', | |
| metavar='FILE', | |
| default='-', | |
| nargs='?', # Required for default. | |
| help='should contain a stack trace in it somewhere the ' | |
| 'tool will find that and re-print it with source ' | |
| 'files and line numbers. If you don\'t pass FILE, ' | |
| 'or if file is -, it reads from stdin.') | |
| args = parser.parse_args() | |
| if args.arch: | |
| symbol.ARCH_IS_32BIT = not "64" in args.arch | |
| if args.symbols_dir: | |
| symbol.SYMBOLS_DIR = args.symbols_dir | |
| if args.symbols_zip: | |
| tmp = tempfile.TemporaryDirectory() | |
| atexit.register(tmp.cleanup) | |
| with zipfile.ZipFile(args.symbols_zip) as zf: | |
| zf.extractall(tmp.name) | |
| symbol.SYMBOLS_DIR = glob.glob("%s/out/target/product/*/symbols" % tmp.name)[0] | |
| symbol.VERBOSE = args.verbose | |
| if args.file == '-': | |
| print("Reading native crash info from stdin") | |
| sys.stdin.reconfigure(errors='ignore') | |
| f = sys.stdin | |
| else: | |
| print("Searching for native crashes in %s" % args.file) | |
| f = open(args.file, "r", errors='ignore') | |
| lines = f.readlines() | |
| f.close() | |
| stack_core.ConvertTrace(lines) | |
| if __name__ == "__main__": | |
| main() | |
| # vi: ts=2 sw=2 |