适用于Jupyter的可视调试器

大多数软件项目的进度基于微小的变化,在继续进行之前,需要仔细评估这些变化。快速的代码执行结果和高速的迭代开发是Jupyter成功的主要原因。特别是在科学研究领域。

Jupyter用户喜欢尝试使用笔记本电脑;他们将笔记本电脑用作一种互动的通讯方式。但是,如果我们谈论经典软件开发的任务(例如,重构大型代码库),那么我们可以说要解决此类问题,Jupyter通常会更改为常规IDE。


JupyterLab环境Jupyter

项目已经工作了几年,以缩小笔记本电脑和常规IDE之间的差距。这些努力主要由JupyterLab平台代表,该平台为开发人员提供了更高级,更方便的界面,其中包括文件管理器,文本编辑器,控制台,记事本。

没错,直到最近,JupyterLab中还是缺少一些东西。这是关于迫使用户切换到其他环境的主要原因。Jupyter用户缺少可视调试器。用户,尤其是那些习惯使用常规IDE的用户,长期以来一直要求使用此功能。

Jupyter调试器


今天,经过几个月的开发,我们很高兴为Jupyter展示可视调试器的第一个公开版本!

这只是第一个版本,但是调试器已经允许您在笔记本单元和源文件中设置断点。它允许您检查变量的内容,查看调用堆栈。而且他的能力不限于此。


Jupyter Visual Debugger的实际应用

在活页夹项目站点上测试调试器



活页夹项目您可以

在活页夹项目网站上尝试使用新的调试器。这是一个演示记事本,您可以进行实验。

安装


调试器的前端可以作为JupyterLab扩展安装:

jupyter labextension install @jupyterlab/debugger

在将来的版本中,默认情况下,调试器前端将包含在JupyterLab中。

在后端,要使调试器正常工作,必须有一个实现了Jupyter调试协议的内核(我们将在下面详细讨论)。到目前为止,唯一实现此协议的内核是xeus-python。它是Python编程语言的Jupyter核心。 (项目开发计划还包括在ipykernel中支持调试器协议。)

您可以按以下方式安装xeus-python内核:

conda install xeus-python -c conda-forge

安装xeus-python和调试器扩展后,一切都应准备就绪,可与Jupyter可视调试器一起使用。

请注意,还有xeus-python的PyPI“轮子”,但它们仍不是试验性的,其可用性取决于平台。

Jupyter调试协议详细信息


ControlControl和IOPub通道的新消息类型


Jupyter内核(执行用户代码的基础结构部分)使用完善的进程间通信协议与系统的其他部分进行通信。

有几种沟通渠道:

  • Shell根据请求/响应方案工作的通道,例如,用于执行代码的请求。
  • 一个通道IOPub,它是从核心到客户端的单向通信通道。例如,它用于重定向标准输出流(stdoutstderr)。
  • 与通道Control相似Shell但在不同套接字上运行的通道因此,他的消息不会与代码执行请求一起排队,并且具有更高的优先级。该频道Control已用于查询InterruptShutdown我们决定将其用于发送到调试器的命令。

协议中添加了两种新的消息类型:


▍ Debug Adapter Protocol


Jupyter体系结构的关键原理是缺乏对某种编程语言的绑定。因此,调试器协议支持适应各种内核实现非常重要。

流行的调试标准是Microsoft开发的调试适配器协议(DAP)。这是基于JSON的协议,例如,它是Visual Studio Code调试子系统的基础。该协议支持许多为不同语言设计的后端。

结果,对于我们来说,通过最近添加的消息debug_[request/reply]来使用DAP消息是完全自然的debug_event

但是,对于Jupyter而言,这还不够:

  • , , , Jupyter ( , , ). debug_request.
  • , , Jupyter, , , , , , .

除这两个区别外,对调试器的请求内容及其答案与DAP相对应。

Jupyter内核协议的所有这些扩展已被提议作为正式规范中的候选对象。可以在此处找到相关的Jupyter开发建议(JEPyter增强建议,JEP)

Xeus-python是第一个支持调试的Jupyter内核


Xeus是Jupyter内核协议的C ++实现。这本身不是核心。这是一个有助于开发内核的库。该库对于为具有C或C ++-API(例如Python,Lua或SQL)的语言开发内核很有用。她采取的执行的耗时的任务护理 Jupyter消息协议。这使核心作者可以专注于与语言结构的解释有关的任务:代码执行,代码分析等。

使用xeus开发了多个内核,其中包括基于CERN中创建的C ++ cling解释器的流行的C ++ xeus-cling内核xeus-python内核是基于xeus的ipykernel替代方案。这里有关xeus-python内核的第一个发行版的材料。

由于以下几个原因,xeus-python内核适用于调试器协议的第一个实现:

  • 它支持竞争性代码执行,这使您可以Control在单独的线程中执行通道的工作
  • 它具有紧凑的代码库。因此,此内核是一个很好的“沙盒”,在其中可以方便地实现新功能。在ipykernel中实施调试器协议的第一个版本将需要更认真的重构,并需要付出更多的努力来协调开发初期的变更。

▍Xeus-python内核开发计划


xeus-python的短期开发目标包括:

  • 添加对IPython功能的支持。现在,与ipykernel相比,这是xeus-python的主要缺失功能。
  • Xeus-python的PyPI-“轮子”的改进。

▍关于其他核心


在支持调试方面已经完成的工作可以与实现扩展内核协议的任何内核一起使用。

今年,我们将努力在尽可能多的内核中提供调试支持。

其他与xeus-python内核有很多共同点的基于xeus的内核也将很快提供调试支持。例如,例如xeus-cling。

调试器前端架构详细信息


JupyterLab 调试器扩展为用户提供了IDE通常期望的机制:

  • 带窗口的边栏,实现以下功能:监视变量,查看断点,查看代码,分析调用堆栈。
  • 可以在代码中直接设置断点的功能,尤其是在记事本单元和控制台中的代码中。
  • 可视标记,指示代码执行停止的位置。

使用Jupyter笔记本时,有关代码执行状态的信息存储在内核中。但是可以执行单元代码,然后可以从笔记本中删除该单元。如果用户在调试过程中想要输入远程代码块,应该怎么办?

该扩展程序支持此特定方案,并且能够以只读模式显示以前执行的单元格的代码。


切换到位于远程单元中

的代码可以调试位于控制台和文件中的代码。


从JupyterLab中的控制台调试代码


在JupyterLab中进行

调试可以在记事本级别启用调试文件中的代码,这将允许用户调试记事本,并同时使用另一个记事本。


同时调试多个笔记本

可以使用树形视图或表视图查看变量。




探索变量工具 JupyterLab的调试器扩展旨在与支持调试的任何内核一起使用。

由于该扩展依赖于DAP协议,因此它抽象了各种语言的功能并为用户提供了一致的调试界面。

下图显示了在用户,JupyterLab扩展和内核之间的调试会话期间发送的消息流。


在调试器中使用调试适配器协议(

未来的计划


到2020年,我们计划认真改善调试器。即,我们正在谈论以下内容:

  • 支持在变量资源管理器窗口中输出各种MIME类型。
  • 支持在调试器界面中使用条件断点。
  • 改善调试器接口的可用性。
  • 通过扩展实现调试Voilà应用程序的功能@jupyter-voila/jupyterlab-preview

亲爱的读者们!您是否尝试过Jupyter视觉调试器?


All Articles