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 摘要。