Skip to content

Install lazydap

Install codelldb first, then lazydap, then run lazydap doctor to confirm each piece is where lazydap expects it.

macOS or Linux. Windows is not a target. Released builds cover macOS arm64 and x86_64 and Linux x86_64; anything else builds from source.

Building from source needs a Rust toolchain, from rustup. The pinned channel comes from rust-toolchain.toml on the first cargo command you run in the repository, so there is nothing to choose. Homebrew and the install script do not need it.

codelldb is the debug adapter that does the actual debugging. lazydap drives it and does not bundle it.

Releases ship as .vsix files, which are renamed zips. VS Code is not involved.

Terminal window
curl -sL -o /tmp/codelldb.vsix \
https://github.com/vadimcn/codelldb/releases/latest/download/codelldb-darwin-arm64.vsix
mkdir -p ~/.local/opt/codelldb
unzip -q -o /tmp/codelldb.vsix -d ~/.local/opt/codelldb

Other platforms: codelldb-linux-x64.vsix, codelldb-linux-arm64.vsix, codelldb-darwin-x64.vsix.

Now put it on PATH with a wrapper script, not a symlink:

mkdir -p ~/.local/bin
cat > ~/.local/bin/codelldb <<'EOF'
#!/usr/bin/env bash
exec "$HOME/.local/opt/codelldb/extension/adapter/codelldb" "$@"
EOF
chmod +x ~/.local/bin/codelldb

Check it runs. --version is not a flag codelldb knows, so use --help:

Terminal window
codelldb --help

If that hangs with no output at all, see quirk 5 — a macOS update can wedge the binary, and the fix is a re-copy.

Whichever route you take, it installs one binary, lazydap. The daemon, the CLI and the TUI are all inside it.

Terminal window
brew install planetaryescape/lazydap/lazydap

The formula comes from the planetaryescape/homebrew-lazydap tap, which the release workflow updates as part of cutting a version.

Terminal window
curl -fsSL https://raw.githubusercontent.com/planetaryescape/lazydap/main/install.sh | bash

It reads uname, downloads the matching release build, and checks its SHA-256 before unpacking it — a checksum checked afterwards only tells you what you already extracted. The binary lands in ~/.local/bin; set LAZYDAP_INSTALL_DIR to put it somewhere else. Nothing in it uses sudo.

Pass a tag to pin a version rather than take the newest:

Terminal window
curl -fsSL https://raw.githubusercontent.com/planetaryescape/lazydap/main/install.sh | bash -s -- v0.2.5
Terminal window
git clone https://github.com/planetaryescape/lazydap
cd lazydap
cargo install --path crates/daemon
Terminal window
$ lazydap doctor --format json
{
"checks": [
{
"detail": "none; create /Users/you/.config/lazydap/config.toml to add one",
"name": "config.file",
"ok": true
},
{
"detail": "/Users/you/.local/bin/codelldb",
"name": "adapter.codelldb",
"ok": true
},
{
"detail": "/opt/homebrew/bin/python3",
"name": "adapter.debugpy",
"ok": true
},
{
"detail": "/Users/you/go/bin/dlv",
"name": "adapter.delve",
"ok": true
},
{
"detail": "/Users/you/lazydap-demo/.lazydap/state.toml (not created yet)",
"name": "state.file",
"ok": true
},
{
"detail": "instance lazydap-demo-13cc8efcde46, pid 53846, protocol v10",
"name": "daemon",
"ok": true
}
],
"ok": true
}

Six checks: whether a config file was found, one per adapter, whether the project’s breakpoint file is readable, and whether a daemon is answering. "ok": true on all six means you can debug anything lazydap supports.

You do not need all three adapters. An adapter.* check that is false shows as missing with the command that installs it, and rules out that language and nothing else: the overall "ok" stays true and the exit code stays 0 as long as one adapter is usable and the config file, the state file and the daemon are sound. Losing the last adapter does fail — nothing can be debugged then.

doctor --check-state is the one form that starts no daemon: it reads .lazydap/state.toml here and names the line, which is what you want when a broken state file is why no daemon will start.

doctor started that daemon. So does every other command — there is nothing to launch by hand, and the daemon guide explains what it does while it is there.

If an adapter check is false, lazydap looked in the config file first and then on PATH, and found nothing either way. config.file shows which file it read, or where to create one.

Terminal window
lazydap completions zsh > ~/.zfunc/_lazydap # zsh
lazydap completions bash > ~/.local/share/bash-completion/completions/lazydap

fish, elvish and powershell also work.

Three adapters, each of which you install yourself — lazydap drives them, it does not bundle them. lazydap doctor --check-adapters reports which ones this machine has.

Language Adapter How to get it
C, C++, Rust codelldb the CodeLLDB releases page, or your package manager
Python debugpy python3 -m pip install debugpy — lazydap looks for an interpreter that can import it
Go delve go install github.com/go-delve/delve/cmd/dlv@latest

js-debug, for Node, is not built yet.