ipython / ipython/ipykernel

Debugger does not conform to DAP specification

未关闭
#1,303 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
734
派生
412
平均合并
1 天 5 小时
30 天内合并 PR
8

描述

Per Microsoft's [documentation for the Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/), a DAP client should send the `launch/attach` request _in parallel_ with the various configuration requests, such as `setBreakpoints` and `setExceptionBreakpoints`. Only once those configuration requests have received responses should the client send `configurationDone`, at which time the adapter will return a response to the original `launch/attach` request. This allows the adapter to fully configure itself before the client considers itself attached.

ipykernel does not currently conform to this specification. It includes a [`_handle_init_sequence`](https://github.com/ipython/ipykernel/blob/main/ipykernel/debugger.py#L252) method which manually sends the `configurationDone` request to the adapter rather than use the original one from the client. It does this in response to the original `attach` request, too, well before the client would have sent that message itself.

**This is problematic because:**
1. This method assumes DAP to work synchronously, whereas by definition the initialization sequence is meant to be conducted in parallel
2. The `configurationDone` request may make it to the adapter before the actual configuration requests (`setBreakpoints`...). This may cause issues (which we have actually seen) where the DAP client receives a response to `attach` before the adapter is done configuring. This leads to breakpoints not being set in time and ultimately being missed.

**The root of this problem** is the synchronous handling of DAP requests by ipykernel; the kernel cannot send Request B until Request A receives a response, so this parallel nature of initialization is currently not possible to conform to.

**The solution to this problem** would be to change how ipykernel handles DAP requests. One solution would be to use a queue to which requests are pushed, similar to how responses are handled. We can implement a working solution and submit a PR, if the maintainers are okay with it.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。