| #!/bin/bash | |
| # Copyright 2020 Google LLC | |
| # | |
| # 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 | |
| # | |
| # https://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. | |
| # 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 ./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" |