| #!/bin/bash |
| |
| # Copyright 2020 The IREE Authors |
| # |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| # Reads text from stdin containing stack frames in the format |
| # `#3 0x5b09835a14 (/data/local/tmp/iree-benchmark-module+0x18aa14)` |
| # and symbolizes such lines and prints them to stdout. |
| # |
| # The approach is to pull the files out of the device and use the host |
| # build of llvm-symbolizer provided in the NDK. |
| # |
| # Other lines are just echo'd to stdout. |
| # This is meant to be used like this: |
| # ANDROID_NDK=~/android-ndk-r21d ./build_tools/scripts/android_symbolize.sh < /tmp/asan.txt |
| # Where one has previously stored e.g. some ASan report to a file, here /tmp/asan.txt. |
| # |
| # See docs/developing_iree/sanitizers.md. |
| # |
| # Discussion of alternatives: https://github.com/android/ndk/issues/753 |
| |
| # Provide the location of your Android NDK in the ANDROID_NDK env var. |
| : ${ANDROID_NDK:=""} |
| |
| if [ -z "${ANDROID_NDK}" ] |
| then |
| echo "Please define ANDROID_NDK to point to your Android NDK." |
| exit 1 |
| fi |
| |
| tmpdir="$(mktemp -d)" |
| |
| while read line |
| do |
| header="$(echo "$line" | grep -o '^\s*#[0-9]\+')" |
| if [ -z "$header" ] |
| then |
| echo "$line" |
| continue |
| fi |
| |
| location_with_parentheses="$(echo "$line" | grep -o '(/[^)]*)$')" |
| location="$(echo "$location_with_parentheses" | tr -d '()' )" |
| file="$(echo "$location" | cut -d '+' -f 1)" |
| address="$(echo "$location" | cut -d '+' -f 2)" |
| if [[ -z "$file" || -z "$address" ]] |
| then |
| echo "$line" |
| continue |
| fi |
| |
| file_basename="$(basename "$file")" |
| pulled_file="$tmpdir/$file_basename" |
| if [ ! -f "$pulled_file" ] |
| then |
| adb pull "$file" "$pulled_file" 1>/dev/null 2>/dev/null |
| fi |
| llvm_symbolizer_output="$($ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-symbolizer --obj "$pulled_file" "$address")" |
| if [ -z "$llvm_symbolizer_output" ] |
| then |
| echo "$line" |
| continue |
| fi |
| |
| function="$(echo "$llvm_symbolizer_output" | head -n1)" |
| source_location="$(echo "$llvm_symbolizer_output" | tail -n1)" |
| echo "$header $source_location $function" |
| done |
| |
| rm -rf "$tmpdir" |