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