xref: /aosp_15_r20/development/scripts/stack (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
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