| #!/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 |