#!/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"