vscode 在调试器UI中的线程状态与从调试适配器发送的内容不匹配,

yyhrrdl8  于 4个月前  发布在  Vscode
关注(0)|答案(2)|浏览(81)

编辑:在下面的评论中查看重现,这可能更容易理解 :-)
我正在调查 dart-lang/sdk#56367 ,它显示调试器在断点处暂停,然后显然恢复并在线程/调用堆栈窗口中显示为“运行”。第二个线程也显示为“在入口处暂停”,尽管后来继续了。
我目前还没有这个的重现,但我有捕获的DAP流量日志,与该线程中的视频一起,我已经仔细检查并注解了重要的行:
dap.txt
视频中的 dart-lang/sdk#56367 在大约 0:10 开始调试会话,这与日志文件中的大约 [3:14:12 AM] 相对应。
视频/日志显示:

  • 用户开始调试会话(0:10,3:14:12 在日志中)
  • 触发断点(视频中的 0:26,日志中的 3:14:26),调用堆栈正确显示线程1在断点处暂停,线程2正在运行
  • 调试器神秘地不再暂停(视频中的 0:26),调用堆栈现在显示线程1正在运行(实际上没有),线程2作为“在入口处暂停”(实际上没有,它已经恢复了,VS Code以前已经在过去显示过)
  • 用户尝试点击暂停按钮(视频中的 0:33,日志中的 3:14:34),但此时,事情出了问题

DAP流量中没有任何东西可以显示在触发断点后线程1取消暂停,也没有线程2再次变为“在入口处暂停”。我觉得VS Code可能以某种方式应用了过去调用堆栈视图的陈旧状态。有许多不同的线程/调用堆栈请求正在进行-是否有可能其中一个完成并使用发送请求之前的信息更新状态?
如果我能重现这个问题,我会回来回复,但我希望有了视频/日志和上面的信息,了解这段代码的人可能会明白发生了什么。

lg40wkob

lg40wkob1#

我已经创建了一个我认为是重现这个问题的复现环境:
https://github.com/DanTup/vscode-mock-debug/tree/repro-vscode-224832
模拟调试适配器是这样做的:

// Start thread 1
await this.delay(1000);
this._threads.push(new Thread(1, 'Thread 1'));
this.sendEvent(new ThreadEvent('started', 1));
this.sendEvent(new OutputEvent('Thread 1 started\n'));
await this.delay(10);
this.sendEvent(new StoppedEvent('entry', 1));
this.sendEvent(new OutputEvent('Thread 1 stopped on entry\n'));
await this.delay(10);
this.sendEvent(new ContinuedEvent(1));
this.sendEvent(new OutputEvent('Thread 1 continued\n'));

// Start thread 2
await this.delay(10);
this._threads.push(new Thread(2, 'Thread 2'));
this.sendEvent(new ThreadEvent('started', 2));
this.sendEvent(new OutputEvent('Thread 2 started\n'));

// Thread 1 hit breakpoint
await this.delay(10);
this.sendEvent(new StoppedEvent('breakpoint', 1));
this.sendEvent(new OutputEvent('Thread 1 stopped on breakpoint\n'));

// Thread 2 stops on entry and resumes
this.sendEvent(new StoppedEvent('entry', 2));
this.sendEvent(new OutputEvent('Thread 2 stopped on entry\n'));
await this.delay(10);
this.sendEvent(new ContinuedEvent(2));
this.sendEvent(new OutputEvent('Thread 2 continued\n'));

线程1在断点处停止,从未恢复。然而,在VS Code中我看到了这样:

编辑: 修正了拼写错误

xghobddn

xghobddn2#

@connor4312 我认为你本月正在使用线程,如果你想查看这个,如果不是,我可以调试它。
感谢重现问题 @DanTup!

相关问题