Compared to launching, attaching to an existing process might seem inferior, but that's far from truth; there are cases where you cannot afford to restart your program, because e.g. the bug is not reproducible outside of a production environment or some other circumstances.
## Configuration
While configuration fields are debug adapter-dependent, most adapters support the following fields:
```json
[
{
// The label for the debug configuration and used to identify the debug session inside the debug panel & new session modal
"label": "Example Start debugger config",
// The debug adapter that Zed should use to debug the program
"adapter": "Example adapter name",
// Request:
// - launch: Zed will launch the program if specified or shows a debug terminal with the right configuration
// - attach: Zed will attach to a running program to debug it or when the process_id is not specified we will show a process picker (only supported for node currently)
"request": "launch",
// program: The program that you want to debug
// This field supports path resolution with ~ or . symbols
"program": "path_to_program",
// cwd: defaults to the current working directory of your project ($ZED_WORKTREE_ROOT)
"cwd": "$ZED_WORKTREE_ROOT"
}
]
```
All configuration fields support task variables. See [Tasks Variables](./tasks.md#variables)
### Build tasks
Zed also allows embedding a Zed task in a `build` field that is run before the debugger starts. This is useful for setting up the environment or running any necessary setup steps before the debugger starts.
```json
[
{
"label": "Build Binary",
"adapter": "CodeLLDB",
"program": "path_to_program",
"request": "launch",
"build": {
"command": "make",
"args": ["build", "-j8"]
}
}
]
```
Build tasks can also refer to the existing tasks by unsubstituted label:
```json
[
{
"label": "Build Binary",
"adapter": "CodeLLDB",
"program": "path_to_program",
"request": "launch",
"build": "my build task" // Or "my build task for $ZED_FILE"
}
]
```
### Automatic scenario creation
Given a Zed task, Zed can automatically create a scenario for you. Automatic scenario creation also powers our scenario creation from gutter.
Automatic scenario creation is currently supported for Rust, Go and Python. Javascript/TypeScript support being worked on.
### Example Configurations
#### JavaScript
##### Debug Active File
```json
[
{
"label": "Debug with node",
"adapter": "JavaScript",
"program": "$ZED_FILE",
"request": "launch",
"console": "integratedTerminal",
"type": "pwa-node"
}
]
```
##### Attach debugger to a server running in web browser (`npx serve`)
Given an externally-ran web server (e.g. with `npx serve` or `npx live-server`) one can attach to it and open it with a browser.
```json
[
{
"label": "Inspect ",
"adapter": "JavaScript",
"type": "pwa-chrome",
"request": "launch",
"url": "http://localhost:5500", // Fill your URL here.
"program": "$ZED_FILE",
"webRoot": "${ZED_WORKTREE_ROOT}"
}
]
```
#### Python
##### Debug Active File
```json
[
{
"label": "Python Active File",
"adapter": "Debugpy",
"program": "$ZED_FILE",
"request": "launch"
}
]
```
##### Flask App
For a common Flask Application with a file structure similar to the following:
```
.venv/
app/
init.py
main.py
routes.py
templates/
index.html
static/
style.css
requirements.txt
```
the following configuration can be used:
```json
[
{
"label": "Python: Flask",
"adapter": "Debugpy",
"request": "launch",
"module": "app",
"cwd": "$ZED_WORKTREE_ROOT",
"env": {
"FLASK_APP": "app",
"FLASK_DEBUG": "1"
},
"args": [
"run",
"--reload", // Enables Flask reloader that watches for file changes
"--debugger" // Enables Flask debugger
],
"autoReload": {
"enable": true
},
"jinja": true,