1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*90c8c64dSAndroid Build Coastguard Worker# 3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2013 The Android Open Source Project 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker"""stack symbolizes native crash dumps.""" 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Workerimport argparse 20*90c8c64dSAndroid Build Coastguard Workerimport atexit 21*90c8c64dSAndroid Build Coastguard Workerimport glob 22*90c8c64dSAndroid Build Coastguard Workerimport sys 23*90c8c64dSAndroid Build Coastguard Workerimport tempfile 24*90c8c64dSAndroid Build Coastguard Workerimport zipfile 25*90c8c64dSAndroid Build Coastguard Worker 26*90c8c64dSAndroid Build Coastguard Workerimport stack_core 27*90c8c64dSAndroid Build Coastguard Workerimport symbol 28*90c8c64dSAndroid Build Coastguard Worker 29*90c8c64dSAndroid Build Coastguard Workerdef main(): 30*90c8c64dSAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description='Parse and symbolize crashes') 31*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('--arch', help='the target architecture') 32*90c8c64dSAndroid Build Coastguard Worker group = parser.add_mutually_exclusive_group() 33*90c8c64dSAndroid Build Coastguard Worker group.add_argument('--symbols-dir', '--syms', '--symdir', help='the symbols directory') 34*90c8c64dSAndroid Build Coastguard Worker group.add_argument('--symbols-zip', help='the symbols.zip file from a build') 35*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('-v', '--verbose', action='store_true', help="include function parameters") 36*90c8c64dSAndroid Build Coastguard Worker parser.add_argument('file', 37*90c8c64dSAndroid Build Coastguard Worker metavar='FILE', 38*90c8c64dSAndroid Build Coastguard Worker default='-', 39*90c8c64dSAndroid Build Coastguard Worker nargs='?', # Required for default. 40*90c8c64dSAndroid Build Coastguard Worker help='should contain a stack trace in it somewhere the ' 41*90c8c64dSAndroid Build Coastguard Worker 'tool will find that and re-print it with source ' 42*90c8c64dSAndroid Build Coastguard Worker 'files and line numbers. If you don\'t pass FILE, ' 43*90c8c64dSAndroid Build Coastguard Worker 'or if file is -, it reads from stdin.') 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker args = parser.parse_args() 46*90c8c64dSAndroid Build Coastguard Worker if args.arch: 47*90c8c64dSAndroid Build Coastguard Worker symbol.ARCH_IS_32BIT = not "64" in args.arch 48*90c8c64dSAndroid Build Coastguard Worker if args.symbols_dir: 49*90c8c64dSAndroid Build Coastguard Worker symbol.SYMBOLS_DIR = args.symbols_dir 50*90c8c64dSAndroid Build Coastguard Worker if args.symbols_zip: 51*90c8c64dSAndroid Build Coastguard Worker tmp = tempfile.TemporaryDirectory() 52*90c8c64dSAndroid Build Coastguard Worker atexit.register(tmp.cleanup) 53*90c8c64dSAndroid Build Coastguard Worker with zipfile.ZipFile(args.symbols_zip) as zf: 54*90c8c64dSAndroid Build Coastguard Worker zf.extractall(tmp.name) 55*90c8c64dSAndroid Build Coastguard Worker symbol.SYMBOLS_DIR = glob.glob("%s/out/target/product/*/symbols" % tmp.name)[0] 56*90c8c64dSAndroid Build Coastguard Worker symbol.VERBOSE = args.verbose 57*90c8c64dSAndroid Build Coastguard Worker if args.file == '-': 58*90c8c64dSAndroid Build Coastguard Worker print("Reading native crash info from stdin") 59*90c8c64dSAndroid Build Coastguard Worker sys.stdin.reconfigure(errors='ignore') 60*90c8c64dSAndroid Build Coastguard Worker f = sys.stdin 61*90c8c64dSAndroid Build Coastguard Worker else: 62*90c8c64dSAndroid Build Coastguard Worker print("Searching for native crashes in %s" % args.file) 63*90c8c64dSAndroid Build Coastguard Worker f = open(args.file, "r", errors='ignore') 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Worker lines = f.readlines() 66*90c8c64dSAndroid Build Coastguard Worker f.close() 67*90c8c64dSAndroid Build Coastguard Worker 68*90c8c64dSAndroid Build Coastguard Worker stack_core.ConvertTrace(lines) 69*90c8c64dSAndroid Build Coastguard Worker 70*90c8c64dSAndroid Build Coastguard Workerif __name__ == "__main__": 71*90c8c64dSAndroid Build Coastguard Worker main() 72*90c8c64dSAndroid Build Coastguard Worker 73*90c8c64dSAndroid Build Coastguard Worker# vi: ts=2 sw=2 74