Chromium Code Reviews| Index: third_party/android_platform/development/scripts/symbol.py |
| diff --git a/third_party/android_platform/development/scripts/symbol.py b/third_party/android_platform/development/scripts/symbol.py |
| index b412e13fc8fc5fffe106f78a3ff45561dc27c9f5..37987ed5b24122ad076951a0c432d5deabbbb4f6 100755 |
| --- a/third_party/android_platform/development/scripts/symbol.py |
| +++ b/third_party/android_platform/development/scripts/symbol.py |
| @@ -21,8 +21,10 @@ The information can include symbol names, offsets, and source locations. |
| import glob |
| import itertools |
| +import logging |
| import os |
| import re |
| +import struct |
| import subprocess |
| import zipfile |
| @@ -36,6 +38,19 @@ ARCH = "arm" |
| TOOLCHAIN_INFO = None |
| +# See: |
| +# http://bugs.python.org/issue14315 |
| +# https://hg.python.org/cpython/rev/6dd5e9556a60#l2.8 |
| +def PatchZipFile(): |
| + oldDecodeExtra = zipfile.ZipInfo._decodeExtra |
| + def decodeExtra(self): |
| + try: |
| + oldDecodeExtra(self) |
| + except struct.error: |
| + pass |
| + zipfile.ZipInfo._decodeExtra = decodeExtra |
| +PatchZipFile() |
| + |
| def Uname(): |
| """'uname' for constructing prebuilt/<...> and out/host/<...> paths.""" |
| uname = os.uname()[0] |
| @@ -121,6 +136,7 @@ def FindToolchain(): |
| else: |
| known_toolchains = [] |
| + logging.debug('FindToolcahin: known_toolchains=%s' % known_toolchains) |
| # Look for addr2line to check for valid toolchain path. |
| for (label, platform, target) in known_toolchains: |
| toolchain_info = (label, platform, target); |
| @@ -206,6 +222,7 @@ def GetCandidates(dirs, filepart, candidate_fun): |
| candidates = PathListJoin([out_dir], buildtype_list) + [CHROME_SYMBOLS_DIR] |
| candidates = PathListJoin(candidates, dirs) |
| candidates = PathListJoin(candidates, [filepart]) |
| + logging.debug('GetCandidates: prefiltered candidates = %s' % candidates) |
| candidates = list( |
| itertools.chain.from_iterable(map(candidate_fun, candidates))) |
| candidates = sorted(candidates, key=os.path.getmtime, reverse=True) |
| @@ -237,7 +254,15 @@ def GetCrazyLib(apk_filename): |
| if match: |
| return match.group(1) |
| -def GetMatchingApks(device_apk_name): |
| +def GetApkFromLibrary(device_library_path): |
| + match = re.match('.*/([^/]*)-[0-9]+[.]apk$', device_library_path) |
| + if not match: |
| + match = re.match('.*/([^/]*)-[0-9]+\/[^/]*\.apk$', device_library_path) |
|
rmcilroy
2015/03/12 21:50:14
Could you put some comments with examples for what
|
| + if not match: |
| + return None |
| + return match.group(1) |
| + |
| +def GetMatchingApks(package_name): |
| """Find any APKs which match the package indicated by the device_apk_name. |
| Args: |
| @@ -246,10 +271,6 @@ def GetMatchingApks(device_apk_name): |
| Returns: |
| A list of APK filenames which could contain the desired library. |
| """ |
| - match = re.match('(.*)-[0-9]+[.]apk$', device_apk_name) |
| - if not match: |
| - return None |
| - package_name = match.group(1) |
| return filter( |
| lambda candidate_apk: |
| ApkMatchPackageName(GetAapt(), candidate_apk, package_name), |
| @@ -265,6 +286,7 @@ def MapDeviceApkToLibrary(device_apk_name): |
| Name of the library which corresponds to that APK. |
| """ |
| matching_apks = GetMatchingApks(device_apk_name) |
| + logging.debug('MapDeviceApkToLibrary: matching_apks=%s' % matching_apks) |
| for matching_apk in matching_apks: |
| crazy_lib = GetCrazyLib(matching_apk) |
| if crazy_lib: |
| @@ -280,18 +302,10 @@ def GetCandidateLibraries(library_name): |
| A list of matching library filenames for library_name. |
| """ |
| return GetCandidates( |
| - ['lib', 'lib.target'], library_name, |
| + ['lib', 'lib.target', '.'], library_name, |
| lambda filename: filter(os.path.exists, [filename])) |
| def TranslateLibPath(lib): |
| - # SymbolInformation(lib, addr) receives lib as the path from symbols |
| - # root to the symbols file. This needs to be translated to point to the |
| - # correct .so path. If the user doesn't explicitly specify which directory to |
| - # use, then use the most recently updated one in one of the known directories. |
| - # If the .so is not found somewhere in CHROME_SYMBOLS_DIR, leave it |
| - # untranslated in case it is an Android symbol in SYMBOLS_DIR. |
| - library_name = os.path.basename(lib) |
| - |
| # The filename in the stack trace maybe an APK name rather than a library |
| # name. This happens when the library was loaded directly from inside the |
| # APK. If this is the case we try to figure out the library name by looking |
| @@ -299,16 +313,30 @@ def TranslateLibPath(lib): |
| # The name of the APK file on the device is of the form |
| # <package_name>-<number>.apk. The APK file on the host may have any name |
| # so we look at the APK badging to see if the package name matches. |
| - if re.search('-[0-9]+[.]apk$', library_name): |
| - mapping = MapDeviceApkToLibrary(library_name) |
| + apk = GetApkFromLibrary(lib) |
| + if apk is not None: |
| + logging.debug('TranslateLibPath: apk=%s' % apk) |
| + mapping = MapDeviceApkToLibrary(apk) |
| if mapping: |
| - library_name = mapping |
| + lib = mapping |
| + |
| + # SymbolInformation(lib, addr) receives lib as the path from symbols |
| + # root to the symbols file. This needs to be translated to point to the |
| + # correct .so path. If the user doesn't explicitly specify which directory to |
| + # use, then use the most recently updated one in one of the known directories. |
| + # If the .so is not found somewhere in CHROME_SYMBOLS_DIR, leave it |
| + # untranslated in case it is an Android symbol in SYMBOLS_DIR. |
| + library_name = os.path.basename(lib) |
| + |
| + logging.debug('TranslateLibPath: lib=%s library_name=%s' % (lib, library_name)) |
| candidate_libraries = GetCandidateLibraries(library_name) |
| + logging.debug('TranslateLibPath: candidate_libraries=%s' % candidate_libraries) |
| if not candidate_libraries: |
| return lib |
| library_path = os.path.relpath(candidate_libraries[0], SYMBOLS_DIR) |
| + logging.debug('TranslateLibPath: library_path=%s' % library_path) |
| return '/' + library_path |
| def SymbolInformation(lib, addr, get_detailed_info): |