| Index: mojo/devtools/common/android_stack_parser/stack
|
| diff --git a/mojo/devtools/common/android_stack_parser/stack b/mojo/devtools/common/android_stack_parser/stack
|
| index 97913ab84191ed7e8d87219a50b702b28762815b..f75d097e7bf14894b8739c555c5095ecab36d05e 100755
|
| --- a/mojo/devtools/common/android_stack_parser/stack
|
| +++ b/mojo/devtools/common/android_stack_parser/stack
|
| @@ -17,11 +17,11 @@
|
| """stack symbolizes native crash dumps."""
|
|
|
| import getopt
|
| -import glob
|
| import os
|
| -import re
|
| +import os.path
|
| import sys
|
|
|
| +import stack_utils
|
| import stack_core
|
| import subprocess
|
| import symbol
|
| @@ -71,102 +71,6 @@ def PrintUsage():
|
| # pylint: enable-msg=C6310
|
| sys.exit(1)
|
|
|
| -def UnzipSymbols(symbolfile, symdir=None):
|
| - """Unzips a file to _DEFAULT_SYMROOT and returns the unzipped location.
|
| -
|
| - Args:
|
| - symbolfile: The .zip file to unzip
|
| - symdir: Optional temporary directory to use for extraction
|
| -
|
| - Returns:
|
| - A tuple containing (the directory into which the zip file was unzipped,
|
| - the path to the "symbols" directory in the unzipped file). To clean
|
| - up, the caller can delete the first element of the tuple.
|
| -
|
| - Raises:
|
| - SymbolDownloadException: When the unzip fails.
|
| - """
|
| - if not symdir:
|
| - symdir = "%s/%s" % (_DEFAULT_SYMROOT, hash(symbolfile))
|
| - if not os.path.exists(symdir):
|
| - os.makedirs(symdir)
|
| -
|
| - print "extracting %s..." % symbolfile
|
| - saveddir = os.getcwd()
|
| - os.chdir(symdir)
|
| - try:
|
| - unzipcode = subprocess.call(["unzip", "-qq", "-o", symbolfile])
|
| - if unzipcode > 0:
|
| - os.remove(symbolfile)
|
| - raise SymbolDownloadException("failed to extract symbol files (%s)."
|
| - % symbolfile)
|
| - finally:
|
| - os.chdir(saveddir)
|
| -
|
| - android_symbols = glob.glob("%s/out/target/product/*/symbols" % symdir)
|
| - if android_symbols:
|
| - return (symdir, android_symbols[0])
|
| - else:
|
| - # This is a zip of Chrome symbols, so symbol.CHROME_SYMBOLS_DIR needs to be
|
| - # updated to point here.
|
| - symbol.CHROME_SYMBOLS_DIR = symdir
|
| - return (symdir, symdir)
|
| -
|
| -
|
| -def GetBasenameFromMojoApp(url):
|
| - """Used by GetSymbolMapping() to extract the basename from the location the
|
| - mojo app was downloaded from. The location is a URL, e.g.
|
| - http://foo/bar/x.so."""
|
| - index = url.rfind('/')
|
| - return url[(index + 1):] if index != -1 else url
|
| -
|
| -
|
| -def GetSymboledNameForMojoApp(path):
|
| - """Used by GetSymbolMapping to get the non-stripped library name for an
|
| - installed mojo app."""
|
| - # e.g. tracing.mojo -> libtracing_library.so
|
| - name, ext = os.path.splitext(path)
|
| - if ext != '.mojo':
|
| - return path
|
| - return 'lib%s_library.so' % name
|
| -
|
| -
|
| -def GetSymbolMapping(lines):
|
| - """Returns a mapping (dictionary) from download file to .so."""
|
| - regex = re.compile('Caching mojo app (\S+) at (\S+)')
|
| - mappings = {}
|
| - for line in lines:
|
| - result = regex.search(line)
|
| - if result:
|
| - url = GetBasenameFromMojoApp(result.group(1))
|
| - mappings[result.group(2)] = GetSymboledNameForMojoApp(url)
|
| - return mappings
|
| -
|
| -
|
| -def _LowestAncestorContainingRelpath(dir_path, relpath):
|
| - """Returns the lowest ancestor dir of |dir_path| that contains |relpath|.
|
| - """
|
| - cur_dir_path = os.path.abspath(dir_path)
|
| - while True:
|
| - if os.path.exists(os.path.join(cur_dir_path, relpath)):
|
| - return cur_dir_path
|
| -
|
| - next_dir_path = os.path.dirname(cur_dir_path)
|
| - if next_dir_path != cur_dir_path:
|
| - cur_dir_path = next_dir_path
|
| - else:
|
| - return None
|
| -
|
| -
|
| -def _GuessDir(relpath):
|
| - """Returns absolute path to location |relpath| in the lowest ancestor of this
|
| - file that contains it."""
|
| - lowest_ancestor = _LowestAncestorContainingRelpath(
|
| - os.path.dirname(__file__), relpath)
|
| - if not lowest_ancestor:
|
| - return None
|
| - return os.path.join(lowest_ancestor, relpath)
|
| -
|
|
|
|
|
| def main():
|
| @@ -204,7 +108,7 @@ def main():
|
| more_info = False
|
|
|
| if not symbol.BUILD_DIR:
|
| - guess = _GuessDir(_DEFAULT_BUILD_DIR)
|
| + guess = stack_utils.GuessDir(_DEFAULT_BUILD_DIR)
|
| if not guess:
|
| print "Couldn't find the build directory, please pass --build-dir."
|
| return 1
|
| @@ -212,7 +116,7 @@ def main():
|
| symbol.BUILD_DIR = guess
|
|
|
| if not symbol.NDK_DIR:
|
| - guess = _GuessDir(_DEFAULT_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
|
| @@ -235,13 +139,13 @@ def main():
|
|
|
| rootdir = None
|
| if zip_arg:
|
| - rootdir, symbol.SYMBOLS_DIR = UnzipSymbols(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 Mojo symbols from", symbol.BUILD_DIR
|
| - stack_core.ConvertTrace(lines, more_info, GetSymbolMapping(lines))
|
| + 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
|
|
|