#!/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 getopt
import os
import os.path
import sys

import stack_utils
import stack_core
import subprocess
import symbol

_DEFAULT_SYMROOT = '/tmp/symbols'
_DEFAULT_BUILD_DIR = 'out/android_Debug'
_DEFAULT_NDK_DIR = 'third_party/android_tools/ndk'


def PrintUsage():
  """Print usage and exit with error."""
  # pylint: disable-msg=C6310
  print
  print "  usage: " + sys.argv[0] + " [options] [FILE]"
  print
  print "  --symbols-dir=path"
  print "       the path to a symbols dir, this is generally for system level"
  print "       symbols"
  print
  print "  --build-dir=path"
  print "       the path to a directory containing Mojo symbols (can be"
  print "       absolute or relative to src), such as =out/android_Debug"

  print "  --ndk-dir=path"
  print "       the path to a directory containing Android NDK"
  print
  print "  --symbols-zip=path"
  print "       the path to a symbols zip file, such as =dream-symbols-12345.zip"
  print
  print "  --more-info"
  print "  --less-info"
  print "       Change the level of detail in the output."
  print "       --more-info is slower and more verbose, but more functions will"
  print "       be fully qualified with namespace/classname and have full"
  print "       argument information. Also, the 'stack data' section will be"
  print "       printed."
  print
  print "  --arch=arm|arm64|x64|x86|mips"
  print "       the target architecture"
  print
  print "  FILE should contain a stack trace in it somewhere"
  print "       the tool will find that and re-print it with"
  print "       source files and line numbers.  If you don't"
  print "       pass FILE, or if file is -, it reads from"
  print "       stdin."
  print
  # pylint: enable-msg=C6310
  sys.exit(1)



def main():
  try:
    options, arguments = getopt.getopt(sys.argv[1:], "",
                                       ["more-info",
                                        "less-info",
                                        "build-dir=",
                                        "ndk-dir=",
                                        "symbols-dir=",
                                        "symbols-zip=",
                                        "arch=",
                                        "help"])
  except getopt.GetoptError, unused_error:
    PrintUsage()

  zip_arg = None
  more_info = False
  for option, value in options:
    if option == "--help":
      PrintUsage()
    elif option == "--symbols-dir":
      symbol.SYMBOLS_DIR = os.path.expanduser(value)
    elif option == "--symbols-zip":
      zip_arg = os.path.expanduser(value)
    elif option == "--arch":
      symbol.ARCH = value
    elif option == "--build-dir":
      symbol.BUILD_DIRS = value.split(',')
    elif option == "--ndk-dir":
      symbol.NDK_DIR = value
    elif option == "--more-info":
      more_info = True
    elif option == "--less-info":
      more_info = False

  if not symbol.BUILD_DIRS:
    guess = stack_utils.GuessDir(_DEFAULT_BUILD_DIR)
    if not guess:
      print "Couldn't find the build directory, please pass --build-dir."
      return 1
    print "Inferring the build directory path as " + guess
    symbol.BUILD_DIRS = [guess]

  if not symbol.NDK_DIR:
    guess = stack_utils.GuessDir(_DEFAULT_NDK_DIR)
    if not guess:
      print "Couldn't find the Android NDK, please pass --ndk-dir."
      return 1
    print "Inferring the Android NDK path as " + guess
    symbol.NDK_DIR = guess


  if len(arguments) > 1:
    PrintUsage()

  if not arguments or arguments[0] == "-":
    print "Reading native crash info from stdin"
    f = sys.stdin
  else:
    print "Searching for native crashes in %s" % arguments[0]
    f = open(arguments[0], "r")

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

  rootdir = None
  if zip_arg:
    rootdir, symbol.SYMBOLS_DIR = stack_utils.UnzipSymbols(zip_arg)

  if symbol.SYMBOLS_DIR:
    print "Reading Android symbols from", symbol.SYMBOLS_DIR

  print "Reading symbols from", symbol.BUILD_DIRS
  stack_core.ConvertTrace(lines, more_info, stack_utils.GetSymbolMapping(lines))

  if rootdir:
    # be a good citizen and clean up...os.rmdir and os.removedirs() don't work
    cmd = "rm -rf \"%s\"" % rootdir
    print "\ncleaning up (%s)" % cmd
    os.system(cmd)

if __name__ == "__main__":
  main()

# vi: ts=2 sw=2
