| #!/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. | |
| ## | |
| 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 | |
| esac | |
| shift | |
| done | |
| # Get the defaulted device address. | |
| target=$(fx-command-run "netaddr" "--fuchsia" "$(get-device-name)") | |
| if [[ -z "${target}" ]]; then | |
| # netaddr will have put the correct error message by now. | |
| echo -e "Could not get a valid target. Run \"fx set-device\"" | |
| exit 1 | |
| 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 -e "Attempting to start the Debug Agent." | |
| if [[ -z "${agent_out}" ]]; then | |
| (fx-command-run "ssh" "${target}" "run debug_agent --port=${port}" &) & | |
| else | |
| (fx-command-run "ssh" "${target}" "run 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 -e "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 -e "Connection found. Starting zxdb." | |
| "${FUCHSIA_BUILD_DIR}/host_x64/zxdb" "--connect" "[${target}]:${port}" "--quit-agent-on-exit" |