diff options
author | Brigid Smith <brigidsmith@google.com> | 2014-06-10 17:31:32 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-06-13 17:43:38 -0700 |
commit | 45a46c61388462c7f4bb826db544b6a1acf8524d (patch) | |
tree | a5adc9655b5a1e1ec2d9efb27247392e3ec03f3b | |
parent | 9649c415e7e959b67a8810cd17ab65b7994c0f71 (diff) | |
download | android_development-45a46c61388462c7f4bb826db544b6a1acf8524d.tar.gz android_development-45a46c61388462c7f4bb826db544b6a1acf8524d.tar.bz2 android_development-45a46c61388462c7f4bb826db544b6a1acf8524d.zip |
Updating stack_core.py to recognize new ABI output from debuggerd.
Change-Id: Ib9736a0509edb97be15f5e89dbc3a5188e744416
-rwxr-xr-x | scripts/stack_core.py | 36 | ||||
-rwxr-xr-x | scripts/symbol.py | 21 |
2 files changed, 38 insertions, 19 deletions
diff --git a/scripts/stack_core.py b/scripts/stack_core.py index 28a59774e..c6d4c1459 100755 --- a/scripts/stack_core.py +++ b/scripts/stack_core.py @@ -23,9 +23,12 @@ import symbol def PrintTraceLines(trace_lines): """Print back trace.""" maxlen = max(map(lambda tl: len(tl[1]), trace_lines)) + spacing = "" + if symbol.ARCH == "arm64" or symbol.ARCH == "mips64" or symbol.ARCH == "x86_64": + spacing = " " print print "Stack Trace:" - print " RELADDR " + "FUNCTION".ljust(maxlen) + " FILE:LINE" + print " RELADDR " + spacing + "FUNCTION".ljust(maxlen) + " FILE:LINE" for tl in trace_lines: (addr, symbol_with_offset, location) = tl print " %8s %s %s" % (addr, symbol_with_offset.ljust(maxlen), location) @@ -58,19 +61,34 @@ def PrintDivider(): print print "-----------------------------------------------------\n" +def CleanLine(ln): + # AndroidFeedback adds zero width spaces into its crash reports. These + # should be removed or the regular expresssions will fail to match. + return unicode(ln, errors='ignore') + def ConvertTrace(lines): """Convert strings containing native crash to a stack.""" + lines = map(CleanLine, lines) + process_info_line = re.compile("(pid: [0-9]+, tid: [0-9]+.*)") + abi_line = re.compile("(ABI: \'(.*)\')") signal_line = re.compile("(signal [0-9]+ \(.*\).*)") - register_line = re.compile("(([ ]*[0-9a-z]{2} [0-9a-f]{8}){4})") thread_line = re.compile("(.*)(\-\-\- ){15}\-\-\-") dalvik_jni_thread_line = re.compile("(\".*\" prio=[0-9]+ tid=[0-9]+ NATIVE.*)") dalvik_native_thread_line = re.compile("(\".*\" sysTid=[0-9]+ nice=[0-9]+.*)") + for line in lines: + abi_header = abi_line.search(line) + if abi_header: + symbol.ARCH = abi_header.group(2) + break + width = "{8}" - if symbol.ARCH == "arm64" or symbol.ARCH == "x86_64": + if symbol.ARCH == "arm64" or symbol.ARCH == "mips64" or symbol.ARCH == "x86_64": width = "{16}" + register_line = re.compile("(([ ]*[0-9a-z]{2} +[0-9a-f]" + width + "){4})") + # Note that both trace and value line matching allow for variable amounts of # whitespace (e.g. \t). This is because the we want to allow for the stack # tool to operate on AndroidFeedback provided system logs. AndroidFeedback @@ -107,17 +125,15 @@ def ConvertTrace(lines): value_lines = [] last_frame = -1 - for ln in lines: - # AndroidFeedback adds zero width spaces into its crash reports. These - # should be removed or the regular expresssions will fail to match. - line = unicode(ln, errors='ignore') + for line in lines: process_header = process_info_line.search(line) signal_header = signal_line.search(line) - register_header = register_line.search(line) thread_header = thread_line.search(line) + register_header = register_line.search(line) + abi_header = abi_line.search(line) dalvik_jni_thread_header = dalvik_jni_thread_line.search(line) dalvik_native_thread_header = dalvik_native_thread_line.search(line) - if process_header or signal_header or register_header or thread_header \ + if process_header or signal_header or thread_header or abi_header or register_header\ or dalvik_jni_thread_header or dalvik_native_thread_header: if trace_lines or value_lines: PrintOutput(trace_lines, value_lines) @@ -137,6 +153,8 @@ def ConvertTrace(lines): print dalvik_jni_thread_header.group(1) if dalvik_native_thread_header: print dalvik_native_thread_header.group(1) + if abi_header: + print abi_header.group(1) continue if trace_line.match(line): match = trace_line.match(line) diff --git a/scripts/symbol.py b/scripts/symbol.py index 3789fa2f0..a3fe03275 100755 --- a/scripts/symbol.py +++ b/scripts/symbol.py @@ -78,20 +78,21 @@ def FindToolchain(): if TOOLCHAIN_INFO is not None: return TOOLCHAIN_INFO + # TODO: TARGET_GCC_VERSION is the version for the primary architecture. + gcc_version = os.environ["TARGET_GCC_VERSION"] + ## Known toolchains, newer ones in the front. - if ARCH == "arm64": - gcc_version = os.environ["TARGET_GCC_VERSION"] + if ARCH == "arm": known_toolchains = [ - ("aarch64-linux-android-" + gcc_version, "aarch64", "aarch64-linux-android") + ("arm-linux-androideabi-" + gcc_version, "arm", "arm-linux-androideabi"), ] - elif ARCH == "arm": - gcc_version = os.environ["TARGET_GCC_VERSION"] + elif ARCH == "arm64": known_toolchains = [ - ("arm-linux-androideabi-" + gcc_version, "arm", "arm-linux-androideabi"), + ("aarch64-linux-android-" + gcc_version, "aarch64", "aarch64-linux-android") ] - elif ARCH =="x86": + elif ARCH =="x86" or ARCH == "x86_64": known_toolchains = [ - ("i686-android-linux-4.4.3", "x86", "i686-android-linux") + ("i686-android-linux" + gcc_version, "x86", "i686-android-linux") ] else: known_toolchains = [] @@ -101,10 +102,10 @@ def FindToolchain(): toolchain_info = (label, platform, target); if os.path.exists(ToolPath("addr2line", toolchain_info)): TOOLCHAIN_INFO = toolchain_info - print "Using toolchain from :" + ToolPath("", TOOLCHAIN_INFO) + print "Using toolchain from: " + ToolPath("", TOOLCHAIN_INFO) return toolchain_info - raise Exception("Could not find tool chain") + raise Exception("Could not find tool chain for (%s, %s, %s)" % (label, platform, target)) def SymbolInformation(lib, addr): """Look up symbol information about an address. |