blob: 27e110b0428f1b76b7f998e1c0e2752520f9e6fa [file] [log] [blame]
#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#### CATEGORY=Run, inspect and debug
### symbolize backtraces and program locations provided as input on stdin
## usage: fx symbolize [--experimental] [--legacy] [-i IDS_TXT_FILE]
## [-r | --remote-symbols]
##
## --experimental use the experimental C++ symbolizer
##
## --legacy use the legacy Go symbolizer
##
## -i IDS_TXT_FILE specify an ids.txt file to be used
##
## --remote-symbols|-r attemp to resolve symbols using predefined remote
## symbol servers for symbols that cannot be resolved
## locally.
##
## --auth (C++ symbolizer) start the authentication process.
##
## Converts sybmolizer markup found in stdin to human readable using
## local symbols (and remote if the --remote-symbols option is used).
## This command is usually used on log output from either zx_log or syslog.
## Anything that is not valid symbolizer markup is left alone. This is similar
## to how c++filt works for demangling C++ symbols.
##
## By default, `fx log` and `fx klog` automatically pipe their results into
## this command.
##
## --experimental / --legacy controls which implementation to use. The default
## is to use the legacy Go symbolizer.
##
## Authentication
##
## If the `--remote-symbols` option is specified, authentication for the symbol
## server is needed.
##
## When using the Go symbolizer, `fx symbolize` will fail if the current user
## is not authenticated or doesn't have enough privileges on the symbol
## servers. To ensure that the current user is properly authenticated, run:
## `gcloud auth application-default login`
##
## When using the C++ implementation, failed or missing authentication will be
## silent. To authenticate, run:
## `fx symbolize --experimental --auth`
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
function go_symbolizer {
fx-config-read
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/contrib/lib/symbol-index.sh || exit $?
ensure-symbol-index-registered || fx-warn "Failed to register ${FUCHSIA_DIR} in symbol-index!"
local symbolize="${HOST_OUT_DIR}/symbolize"
if [[ ! -x "${symbolize}" ]]; then
fx-error "Cannot execute '${symbolize}'. Try \`fx build\` first."
exit 1
fi
local llvm_symbolizer="${PREBUILT_CLANG_DIR}/bin/llvm-symbolizer"
local extra_args=()
for i in "${ids_txt[@]}"; do
extra_args+=(-ids-txt "${i}")
done
if [[ "${is_remote}" -eq 1 ]]; then
extra_args+=(
"-symbol-cache" "$HOME/.fuchsia-symbol-cache"
"-symbol-server" "gs://fuchsia-artifacts/debug"
"-symbol-server" "gs://fuchsia-artifacts-internal/debug"
"-symbol-server" "gs://fuchsia-artifacts-release/debug"
)
trap '_code=$?; set +x; exit-with-warning ${_code}' ERR
fi
"${symbolize}" -llvm-symbolizer "${llvm_symbolizer}" -ids-rel "${extra_args[@]}"
}
function cpp_symbolizer {
fx-config-read
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/contrib/lib/symbol-index.sh || exit $?
ensure-symbol-index-registered || fx-warn "Failed to register ${FUCHSIA_DIR} in symbol-index!"
local symbolizer="${HOST_OUT_DIR}/symbolizer"
if [[ ! -x "${symbolizer}" ]]; then
fx-error "Cannot execute '${symbolizer}'. Try \`fx build\` first."
exit 1
fi
local extra_args=()
for i in "${ids_txt[@]}"; do
extra_args+=(--ids-txt "${i}")
done
if [[ "${is_remote}" -eq 1 ]]; then
if [[ ! -f ~/.fuchsia/debug/googleapi_auth && ! -f ~/.config/gcloud/application_default_credentials.json ]]; then
fx-error "Please authenticate first using \`fx symbolize --experimental --auth\`."
exit 1
fi
extra_args+=(
"--symbol-server" "gs://fuchsia-artifacts/debug"
"--symbol-server" "gs://fuchsia-artifacts-internal/debug"
"--symbol-server" "gs://fuchsia-artifacts-release/debug"
)
fi
if [[ "${auth_mode}" -eq 1 ]]; then
extra_args+=(--auth)
fi
"${symbolizer}" "${extra_args[@]}"
}
function exit-with-warning {
local error_code="$1"
if [[ "${error_code}" -ne 0 ]]; then
fx-error "If you are having trouble with authentication, make sure you are" \
"authenticated in gcloud and you have permission to access" \
"the remote symbols servers.\nSee \`fx help symbolize\` for more information"
fi
exit ${error_code}
}
declare ids_txt=()
declare is_remote=0
declare auth_mode=0
declare use_experimental=1
while [[ $# -ne 0 ]]; do
case "$1" in
-h|--help)
fx-command-help
exit 0
;;
--experimental)
use_experimental=1
;;
--legacy)
use_experimental=0
;;
--auth)
auth_mode=1
;;
-i)
if [[ $# -lt 2 ]]; then
fx-error Invalid syntax
fx-command-help
return 1
fi
ids_txt+=("$2")
shift
;;
--remote-symbols|-r)
is_remote=1
;;
*)
fx-error Invalid syntax
fx-command-help
exit 1
esac
shift
done
if [[ "${is_remote}" -eq 1 ]]; then
extra_args+=(
"-symbol-cache" "$HOME/.fuchsia-symbol-cache"
"-symbol-server" "gs://fuchsia-artifacts/debug"
"-symbol-server" "gs://fuchsia-artifacts-internal/debug"
"-symbol-server" "gs://fuchsia-artifacts-release/debug"
)
fi
if [[ "${use_experimental}" -eq 1 ]]; then
cpp_symbolizer
else
go_symbolizer
fi