blob: 1b2428b9a58e3c5b243028feceb27241c0490bd5 [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 [-i IDS_TXT_FILE] [-r | --remote-symbols]
##
## -i IDS_TXT_FILE specify an ids.txt file to be used
##
## --remote-symbols|-r attempt to resolve symbols using predefined remote
## symbol servers for symbols that cannot be resolved
## locally.
##
## --auth (C++ symbolizer) start the authentication process.
##
## Converts symbolizer 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.
##
## Authentication
##
## If the `--remote-symbols` option is specified, authentication for the symbol
## server is needed. However, failed or missing authentication is silent.
## To authenticate, run:
## `fx symbolize --auth`
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
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 --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
while [[ $# -ne 0 ]]; do
case "$1" in
-h|--help)
fx-command-help
exit 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
cpp_symbolizer