blob: 42e95de569f9eba801b792d6efe19155da409e1f [file] [log] [blame] [edit]
#!/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"