| # Developing and debugging zxdb |
| |
| This document covers various topics to help you as you develop and debug the |
| zxdb debugger: |
| |
| * [Run tests](#run-tests) |
| * [Reload `debug_agent.cm` after a new build](#reload-debug_agent) |
| * [Enable debug logging in `debug_agent`](#enable-debug-logging-debug_agent) |
| * [Enable debug logging in zxdb](#enable-debug-logging) |
| * [Launch zxdb in another debugger](#launch-zdb-other-debugger) |
| * [Debug `debug_agent` in another `debug_agent`](#debug-agent-in-another-agent) |
| |
| ## Run tests {:#run-tests} |
| |
| To run the zxdb frontend tests: |
| |
| Note: These tests run on the machine with your current Fuchsia checkout. |
| |
| ```posix-terminal |
| fx test zxdb_tests |
| ``` |
| |
| To run the `debug_agent` tests: |
| |
| Note: These tests run on a Fuchsia target device. |
| |
| ```posix-terminal |
| fx test debug_agent_unit_tests |
| fx test debug_agent_integration_tests |
| ``` |
| |
| To run the end-to-end tests: |
| |
| Note: These test the integration of the zxdb frontend with the `debug_agent`. |
| |
| ```posix-terminal |
| fx test --e2e zxdb_e2e_tests |
| ``` |
| |
| ## Reload `debug_agent.cm` after a new build {:#reload-debug_agent} |
| |
| Since the `debug_agent_launcher` is a long-running process, your system does |
| not try to update the `debug_agent` package after the first `ffx debug connect` |
| invocation. |
| |
| To force the system to unload `debug_agent.cm`: |
| |
| ```posix-terminal |
| ffx component stop /core/debug_agent |
| ``` |
| |
| ## Enable debug logging in `debug_agent` {:#enable-debug-logging-debug_agent} |
| |
| To enable the debug logging of the `debug_agent`, add |
| `--set-severity core/debug_agent#DEBUG` to `fx log`. For example: |
| |
| ```posix-terminal |
| fx log --set-severity core/debug_agent#DEBUG --tag debug_agent --hide_metadata --pretty |
| ``` |
| |
| ## Enable debug logging in zxdb {:#enable-debug-logging} |
| |
| To enable debug logging in zxdb: |
| |
| ```posix-terminal |
| ffx debug connect -- --debug-mode |
| ``` |
| |
| ## Launch zxdb in another debugger {:#launch-zdb-other-debugger} |
| |
| You can have `ffx debug` launch zxdb in another debugger such as `lldb`. For |
| example: |
| |
| ```posix-terminal |
| ffx debug connect --debugger lldb |
| ``` |
| |
| This command brings the lldb shell and you can use `run` to start zxdb. |
| |
| Alternatively, instead of `lldb` you could specify another debugger such as `gdb`. |
| However, if you use `gdb`, you may run into some of the following issues: |
| |
| * Older versions of `gdb` may not support all DWARF 5 standards. Which may |
| result some missing information such as source file listing. |
| * `Ctrl-C` does not return you from zxdb to `gdb`. To stop zxdb, from another |
| terminal, run: |
| |
| ```posix-terminal |
| pkill -INT zxdb` |
| ``` |
| |
| ## Debug `debug_agent` in another `debug_agent` {:#debug-agent-in-another-agent} |
| |
| You can attach a `debug_agent` to another `debug_agent`: |
| |
| Note: This is a task to help debug issues with zxdb. |
| |
| 1. Run the debugger that attaches to the "to-be-debugged" `debug_agent` that you |
| want to debug: |
| |
| ```posix-terminal |
| ffx debug connect |
| ``` |
| |
| 1. From the zxdb console, run: |
| |
| ```none {: .devsite-terminal data-terminal-prefix="[zxdb]" } |
| attach debug_agent |
| Waiting for process matching "debug_agent". |
| Type "filter" to see the current filters. |
| Attached Process 1 state=Running koid=345223 name=debug_agent.cm |
| Attached Process 2 state=Running koid=345403 name=/pkg/bin/debug_agent |
| ``` |
| |
| 1. The first `debug_agent` captures the launcher and itself. You can detach the |
| processes to avoid any deadlock. |
| |
| For example, to detach process 1: |
| |
| ```none {:.devsite-disable-click-to-copy} |
| [zxdb] pr 1 detach |
| ``` |
| |
| For example, to detach process 2: |
| |
| ```none {:.devsite-disable-click-to-copy} |
| [zxdb] pr 2 detach |
| ``` |
| |
| 1. Create a breakpoint on the `$main` function: |
| |
| ```none {:.devsite-disable-click-to-copy} |
| [zxdb] break $main |
| ``` |
| |
| 1. From another terminal, launch another zxdb instance: |
| |
| ```posix-terminal |
| ffx debug connect |
| ``` |
| |
| 1. In the initial terminal with zxdb, you should see an output like: |
| |
| ```none {:.devsite-disable-click-to-copy} |
| Attached Process 1 state=Running koid=12345 name=/pkg/bin/debug_agent |
| Breakpoint 1 now matching 1 addrs for $main |
| 🛑 process 1 on bp 1 main(int, const char**) • main.cc:101 |
| 99 |
| 100 int main(int argc, const char* argv[]) { |
| â–¶ 101 debug_agent::CommandLineOptions options; |
| 102 cmdline::Status status = ParseCommandLine(argc, argv, &options); |
| 103 if (status.has_error()) { |
| ``` |
| |
| You now have two instances of zxdb running. |