#!/usr/bin/env python
#
# 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 sys

import stack_core
import symbol

def main():
  parser = argparse.ArgumentParser(description='Parse and symbolize crashes')
  parser.add_argument('--arch', help='the target architecture')
  parser.add_argument('--syms', '--symdir', help='the symbols directory')
  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 = args.arch
  if args.syms:
    symbol.SYMBOLS_DIR = args.syms
  if args.file == '-':
    print "Reading native crash info from stdin"
    f = sys.stdin
  else:
    print "Searching for native crashes in %s" % args.file
    f = open(args.file, "r")

  lines = f.readlines()
  f.close()

  stack_core.ConvertTrace(lines)

if __name__ == "__main__":
  main()

# vi: ts=2 sw=2
