blob: 3b8351c4f404d05c155e2f161ba11f07cdf37fbd [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.
##
## Usage: fx debug [(--port|-p) <PORT>] [(--verbose-agent|-va)] [--] [TARGET]
##
## --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.
##
## TARGET The hostname of the target to connect to. Initially, it
## will attempt to pass it to netaddr to check if it is a
## fuchsia IP word encoding. If not, it will attempt to use
## it directly as a hostname.
## Can be ommited if there is only one target.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read
# Defaults.
port=2345
agent_out="/dev/null"
# Flag parsing.
while [[ "$1" =~ ^- ]]; do
case "$1" in
--help|-h)
fx-command-help
exit 0
;;
--port|-p)
shift
port="$1"
;;
--verbose-agent|-va)
shift
agent_out=""
break
;;
--)
break
;;
*)
break
esac
shift
done
# The target is the first non-flag argument.
target="$1"
# Initially, We attempt to see if this is a netaddr target name. If not, we're
# going to try it directly as a hostname.
netaddr_target=$(fx-command-run "netaddr" "--fuchsia" "${target}")
if [[ -z ${netaddr_target} ]]; then
# No valid netaddr and no explicit target.
if [[ -z ${target} ]]; then
echo -e "Could not get a valid target. Exiting."
exit 1
fi
echo "Target is not a Fuchsia target name. Attempting to use it as hostname."
else
# netaddr generated a valid target. Using that one.
target="${netaddr_target}"
fi
# 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 "Attempting to start the Debug Agent."
if [[ -z "${agent_out}" ]]; then
(fx-command-run "ssh" "${target}" "debug_agent --port=${port}" &) &
else
(fx-command-run "ssh" "${target}" "debug_agent --port=${port}" &) > "${agent_out}" 2>&1 &
fi
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.
nc -w5 -6 -z ${target} ${port}
# If successful, we proceed to connect.
if [[ "$?" -eq 0 ]]; 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
echo -e "Timed out trying to find the Debug Agent. Exiting."
echo -e "Attempting to kill SSH connection."
kill "${fx_ssh_pid}"
exit 1
fi
sleep 1
done
# We start the client with the flag that tells it to quit the agent when zxdb
# quits.
echo "Connection found. Starting ZXDB."
"${FUCHSIA_BUILD_DIR}/host_x64/zxdb" "--connect" "[${target}]:${port}" "--quit-agent-on-exit"