Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debugger implementation #13433

Draft
wants to merge 933 commits into
base: main
Choose a base branch
from
Draft

Conversation

RemcoSmitsDev
Copy link
Contributor

@RemcoSmitsDev RemcoSmitsDev commented Jun 23, 2024

DISCLAIMER

As of 6th March 2025, debugger is still in development. We plan to merge it behind a staff-only feature flag for staff use only, followed by non-public release and then finally a public one (akin to how Git panel release was handled). This is done to ensure the best experience when it gets released.

END OF DISCLAIMER

The current state of the debugger implementation:

Screen.Recording.2024-10-16.at.15.02.20.mov
Screen.Recording.2025-01-19.at.17.45.06.mov

All the todo's are in the following channel, so it's easier to work on this together:
https://zed.dev/channel/zed-debugger-11370

If you are on Linux, you can use the following command to join the channel:

zed https://zed.dev/channel/zed-debugger-11370 

Current Features

  • Collab
    • Breakpoints
      • Sync when you (re)join a project
      • Sync when you add/remove a breakpoint
    • Sync active debug line
    • Stack frames
      • Click on stack frame
        • View variables that belong to the stack frame
        • Visit the source file
      • Restart stack frame (if adapter supports this)
    • Variables
    • Loaded sources
    • Modules
    • Controls
      • Continue
      • Step back
        • Stepping granularity (configurable)
      • Step into
        • Stepping granularity (configurable)
      • Step over
        • Stepping granularity (configurable)
      • Step out
        • Stepping granularity (configurable)
    • Debug console
  • Breakpoints
    • Log breakpoints
    • line breakpoints
    • Persistent between zed sessions (configurable)
    • Multi buffer support
    • Toggle disable/enable all breakpoints
  • Stack frames
    • Click on stack frame
      • View variables that belong to the stack frame
      • Visit the source file
      • Show collapsed stack frames
    • Restart stack frame (if adapter supports this)
  • Loaded sources
    • View all used loaded sources if supported by adapter.
  • Modules
    • View all used modules (if adapter supports this)
  • Variables
    • Copy value
    • Copy name
    • Copy memory reference
    • Set value (if adapter supports this)
    • keyboard navigation
  • Debug Console
    • See logs
    • View output that was sent from debug adapter
      • Output grouping
    • Evaluate code
      • Updates the variable list
      • Auto completion
        • If not supported by adapter, we will show auto-completion for existing variables
  • Debug Terminal
    • Run custom commands and change env values right inside your Zed terminal
  • Attach to process (if adapter supports this)
    • Process picker
  • Controls
    • Continue
    • Step back
      • Stepping granularity (configurable)
    • Step into
      • Stepping granularity (configurable)
    • Step over
      • Stepping granularity (configurable)
    • Step out
      • Stepping granularity (configurable)
    • Disconnect
    • Restart
    • Stop
  • Warning when a debug session exited without hitting any breakpoint
  • Debug view to see Adapter/RPC log messages
  • Testing
    • Fake debug adapter
      • Fake requests & events

Release Notes:

  • N/A

@cla-bot cla-bot bot added the cla-signed The user has signed the Contributor License Agreement label Jun 23, 2024
@davidbuzz
Copy link
Contributor

Add documententation and/or an example on how to configure and/enable this for a specific debugger... if not as part of this PR then to the todo list ?

@osiewicz
Copy link
Contributor

Change client id to be language id because you should only run one client per language at the same time

What if you have e.g. a monorepo with multiple services written in the same language?

@RemcoSmitsDev
Copy link
Contributor Author

Uhm, I think most of the debug adapters support multiple threads, but need to look more in to that. Not sure how VS Code handles this, if they allow you to run the same debugger adapter twice or more.

@RemcoSmitsDev RemcoSmitsDev force-pushed the debugger branch 2 times, most recently from c71eb06 to 47a5f0c Compare June 29, 2024 14:47
@davidbuzz
Copy link
Contributor

I'd love to see another more up-to-date video of the current status of this, if u can find time. :-)

@RemcoSmitsDev RemcoSmitsDev force-pushed the debugger branch 3 times, most recently from ac95fbd to 515122c Compare July 3, 2024 21:20
@jonahcui
Copy link

jonahcui commented Jul 4, 2024

HI, I have started a dlv(go dap server) to debug go program, but i need bring env to the dlv commend. I read the code DebugAdapterClient, i think when create_tcp_client or create_stdio_client, we should bring env configuration to command.

@RemcoSmitsDev
Copy link
Contributor Author

RemcoSmitsDev commented Jul 4, 2024

HI, I have started a dlv(go dap server) to debug go program, but i need bring env to the dlv commend. I read the code DebugAdapterClient, i think when create_tcp_client or create_stdio_client, we should bring env configuration to command.

Hey, I think most debug adapters support this already by passing in an env prop through the launch or attach request. See the JS debugger config options. We already support passing in your own config values, so I don't think we need to add more configuration for this. Because it's on the debug adapter for getting this data and handling it how they want.

@jonahcui
Copy link

jonahcui commented Jul 4, 2024

HI, I have started a dlv(go dap server) to debug go program, but i need bring env to the dlv commend. I read the code DebugAdapterClient, i think when create_tcp_client or create_stdio_client, we should bring env configuration to command.

Hey, I think most debug adapters support this already by passing in an env prop through the launch or attach request. See the JS debugger config options. We already support passing in your own config values, so I don't think we need to add more configuration for this. Because it's on the debug adapter for getting this data and handling it how they want.

Ok, understand.... I will test it on js debugger and go delve and study your code.

@RemcoSmitsDev RemcoSmitsDev force-pushed the debugger branch 4 times, most recently from 7eacd30 to 3f8581a Compare July 5, 2024 14:54
@RemcoSmitsDev RemcoSmitsDev force-pushed the debugger branch 2 times, most recently from 8adc489 to 8d99f9b Compare July 12, 2024 20:01
@davidbuzz
Copy link
Contributor

davidbuzz commented Jul 15, 2024

for those of us trying to follow-along at home on this PR, it would be helpful of there was a sample tasks.json ( or wherever the debug settings are being stored if not there ) and any relevent settings.json we need enable, as I compiled and ran this PR, but was unable to get the same behaviour as either of the screen recordings.
for example: ctrl-shift-p[command palette] -> 'debug panel: open panel' gave me an empty lower panel with no start/stop/pause etc, and none of the other demonstrated command-palette/s seemed to do anything.

@RemcoSmitsDev
Copy link
Contributor Author

RemcoSmitsDev commented Jul 15, 2024

Hey @davidbuzz, sorry for not posting any examples of starting a debug adapter. I did this for a reason, because I'm not happy yet with the naming of the fields & structure of the task. But here is an example task to start a debug adapter:

If you want to follow a bit more about what we are working on, you can join the following channel: https://zed.dev/channel/zed-debugger-11370.

{
  "label": "Xdebug debug adapter",
  "command": "bun",
  "args": [
    "/Users/remcosmits/Documents/code/vscode-php-debug/out/phpDebug.js",
    "--server=8132"
  ],
  "task_type": "debug",
  "cwd": "/Users/remcosmits/Documents/code/symfony_demo",
  "debug_adapter": {
    "id": "xdebug",
    "port": 8132,
    "request_args": {
      "skipFiles": ["**/vendor/**"],
      "pathMappings": {
        "/Users/remcosmits/Documents/code/symfony_demo/public": "/Users/remcosmits/Documents/code/symfony_demo/public"
      },
      "localSourceRoot": "/Users/remcosmits/Documents/code/symfony_demo",
      "serverSourceRoot": "/Users/remcosmits/Documents/code/symfony_demo",
      "xdebugSettings": {
        "show_hidden": 1
      }
    }
  }
}

@RemcoSmitsDev RemcoSmitsDev force-pushed the debugger branch 2 times, most recently from d9461c3 to b6e677e Compare July 15, 2024 16:44
@davidbuzz
Copy link
Contributor

davidbuzz commented Jul 16, 2024

i think u mean this discord channel, but u were close.. https://discord.com/channels/869392257814519848/1255246362220691456 ... i pop in to the Zed discord occassionally. :-)

@RemcoSmitsDev
Copy link
Contributor Author

i think u mean this discord channel, but u were close.. https://discord.com/channels/869392257814519848/1255246362220691456 ... i pop in to the Zed discord occassionally. :-)

No, that's not what I mean. What do you mean by I'm close? It sounds a bit disparaging...

@davidbuzz
Copy link
Contributor

I was just trying to say that the link u gave starting with https://zed.dev doesn't work for me.

@RemcoSmitsDev
Copy link
Contributor Author

Ahh oké. it seems to work for other people. Also it's the same as the one that i posted in the discord channel. Does it still not work for you?

@davidbuzz
Copy link
Contributor

Ahh oké. it seems to work for other people. Also it's the same as the one that i posted in the discord channel. Does it still not work for you?

... im on linux. :-)

Anthony-Eid and others added 8 commits March 14, 2025 14:59
Request handlers are now called with an error when a DAP server doesn't support a request we attempt to send.
This allows response handlers to handle more errors gracefully

I added a new thread status "Stepping" that represents the intermediate
state of a thread when we send a step command and haven't gotten a
response.

This allows us to handle error responses correctly and disable sending
multiple step requests for the same thread while any are being processed
I also did a mini refactor to how we send breakpoints. Now there are two
functions send_all_breakpoints and send_breakpoints_from_path that
Session::Local mode uses.

send_all_breakpoints is used in the initialization process of a DAP
server and when toggling ignore breakpoints. send_breakpoints_from_path
is used to let DAP servers know when there has been an update to
breakpoint's in a specific file and when a file has been saved
Anthony-Eid and others added 11 commits March 14, 2025 22:46
This also allows us to remove the _unused field too.

Co-authored-by: Piotr <[email protected]>
…w Architecture

This is the first step to getting RunInTerminal support back, the second is testing.
While Remco didn't pair up with me for this commit, almost everything I added back was
based on his work with minor modifications. So I put him as a co-author

Co-authored-by: Remco Smits <[email protected]>
I had to add error checking to the cwd where the debug panel handles the request
It also fails when the configuration sequence has any failures too
This commit also changes the indicies to be the variable names instead
of their IDs. Because that's the only thing that is safe to use across
stopping states.
RemcoSmitsDev and others added 6 commits March 15, 2025 17:56
work properly

We also clean up a lot of the misdirection in the code to improve
readability.

Co-authored-by: Remco Smits <[email protected]>
Its because it requires the session to exist, but we did not insert the
session early enough so we hitted an early return because the session
couldn't be found.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cla-signed The user has signed the Contributor License Agreement
Projects
None yet
Development

Successfully merging this pull request may close these issues.