blob: 482a778501accd5f7d151295185212c08256d2bd [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.
### run the debug agent on target and connect to it with zxdb
## Starts the debug agent on the proposed target and automatically connect zxdb
## to it. Will close the debug agent on exit.
##
## TROUBLESHOOTING TIPS:
##
## - Remember to use "fx set-device" when working with multiple devices.
## - This scripts by default will mute the SSH connection stdout/stderr, so any
## errors triggered by it won't appear. Use the --verbose-agent flag to see
## the output.
## - This scripts uses the tool "nc" for testing TCP connections. Check that it
## is in $PATH and that it works.
##
## Usage: fx debug [(--port|-p) <PORT>] [(--verbose-agent|-va)]
##
## --port Port the debug agent will be listening on. Will use 2345
## by default.
## --verbose-agent Whether the debug agent's stdout/stderr should be shown.
## Useful for debugging the debugger. Yo' dawg.
##
## Flags after -- are parsed by zxdb. See zxdb's documentation for more
## details.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $?
fx-config-read
source "${FUCHSIA_DIR}/buildtools/vars.sh"
# Defaults.
port=
core=
unwind_flag=
agent_out="/dev/null"
# Flag parsing.
while [[ $# -gt 0 ]]; do
case "$1" in
--help|-h)
fx-command-help
exit 0
;;
--port|-p)
shift
port="$1"
;;
--verbose-agent|-va)
agent_out="/dev/stdout"
;;
--core|-c)
arg=$1
shift
core="$1"
if [[ -z "${core}" ]]; then
echo "${arg} takes an argument"
exit 1
fi
;;
--core=*)
core="${1:7}"
;;
--unwind)
shift
unwind_flag="--unwind=$1"
;;
--unwind=*)
unwind_flag="--unwind=${1:9}"
;;
--)
shift
break # Remaining flags are passed to zxdb
;;
*)
echo "Invalid flag $1"
exit 1
esac
shift
done
if [[ -n "${port}" && -n "${core}" ]]; then
echo "Specifying both a port and a core doesn't make sense"
exit 1
fi
if [[ -n "${core}" && ! -f "${core}" ]]; then
echo "Cannot find file ${core}"
exit 1
fi
if [[ -z "${port}" ]]; then
port=2345
fi
# Get the defaulted device address.
target=$(get-fuchsia-device-addr)
if [[ -z "${target}" ]]; then
fx-error "Could not find fuchsia device" "$(get-device-name)"
exit 1
fi
connect_ops=
if [[ -z "${core}" ]]; then
debug_agent_pkg="fuchsia-pkg://fuchsia.com/debug_agent#meta/debug_agent.cmx"
fx_ssh_pid=""
trap 'kill ${fx_ssh_pid}' EXIT
# Leave the SSH connection open. Will be closed on script end.
# We branch out on whether the user used the verbose-agent flag. If so, we
# redirect the debug agent output to /dev/null.
echo -e "Attempting to start the Debug Agent."
fx-command-run "ssh" "${target}" "run ${debug_agent_pkg} --port=${port} ${unwind_flag}" > "${agent_out}" 2>&1 &
fx_ssh_pid="$!"
# We wait until the debug agent is listening on the given port. We use NC to
# attemp a tcp connection. This will actually go all the way with the handshake,
# so the debug agent will think initially that NC is a client. But then it will
# close the connection and receive the actual client's connection and work fine.
try_count=0
max_tries=10
echo "Waiting for the Debug Agent to start."
while true; do
# Use NC to test if the port is open and the debug agent is listening.
if nc -w5 -6 -z "${target}" "${port}"; then
break
fi
# Otherwise, we count and check if we need to exit.
try_count=$(expr "${try_count}" + 1)
if [[ "${try_count}" -gt "${max_tries}" ]]; then
fx-error "Timed out trying to find the Debug Agent. Exiting."
exit 1
fi
sleep 1
done
connect_ops="--connect [${target}]:${port}"
else
connect_ops="--core ${core}"
fi
# We start the client with the flag that tells it to quit the agent when zxdb quits.
"${FUCHSIA_BUILD_DIR}/host_x64/zxdb" \
${connect_ops} \
"--quit-agent-on-exit" \
"-s" "${FUCHSIA_BUILD_DIR}" \
"-s" "${ZIRCON_BUILDROOT}" \
"-s" "${BUILDTOOLS_CLANG_DIR}/lib/debug" \
"--symbol-cache" ~ \
"--symbol-server" "gs://fuchsia-infra-debug-symbols" \
$@