编写Iron Python调试器

Jus*_*tin 9 debugging clr ironpython

作为一个学习练习,我正在使用IronPython编写一个简单的扩展/插件/宏框架 - 我已经掌握了基础知识,但我想添加一些基本的调试支持,以使我的脚本编辑器更易于使用.

我一直在互联网上搜索一下,我发现了一些编写托管调试器的好资源(包括Mike Stall的优秀.Net调试博客CLR调试API上的MSDN文档) - 我知道IronPython是基本上是IL,但除此之外,我对如何开始有点迷失,特别是:

  • 调试动态语言(如IronPython)与静态语言(如C#)之间是否存在显着差异?
  • 我是否需要以特殊方式执行我的脚本以使IronPython输出合适的调试信息?
  • 调试在当前进程内运行的脚本是否会导致死锁,或者IronPython是否在子进程中执行我的脚本?
  • 我最好先研究如何制作一个简单的C#调试器以获得一般的想法?

(我现在对制作调试器的GUI方面不感兴趣 - 我已经非常了解这可能如何工作)

Jus*_*tin 9

还有一些链接开始使这更加清晰 - 我已经看到了两种添加调试器支持的方法:

将IronPython调试为CLR应用程序

第一个是使用IronPython发出IL并使用用于调试.Net应用程序的标准技术对其进行调试的事实.关于ipydbg的开发,这里有关于这种方法的一系列博客文章,这是一个使用这种方法的python调试器.

  • 有关.Net调试功能的公开位置及其周围的各种包装(mdbg)的概述,请参阅此文章
  • 这种方法的缺点是这种调试形式完全阻止了正在调试的应用程序,因此您必须在第二个应用程序中执行脚本.

使用Microsoft.Scripting.Debugging

由于这种限制,生成了Microsoft.Scripting.Debugging库,这更适合于运行IronPython"嵌入"的应用程序(即在同一进程中).

有一个介绍,它在这里和它是如何使用更广泛的博客文章在这里 -本质上,它是由哪些每次执行任何的回调函数的"有趣"的情况发生(我们每次进入一个功能的时候,每次我们从返回功能和每次执行一行).回调函数运行时,脚本的执行被阻止,这允许您"中断"脚本.

我决定采取第二种方法 - 我将更新这篇文章,因为我发现了更多可能对其他人试图做到这一点的信息.


Bri*_*sen 6

我不是IronPython的专家,但我在使用WinDbg调试托管应用程序方面有一些经验.我简要介绍了IronPython应用程序在调试器中的外观.由于Python的动态特性,很多代码都是在运行时发出的.这使得调试IronPython应用程序比说C#应用程序更复杂,因为你可以说有一层额外的代码生成.

曾经大量参与Iron语言开发的Harry Pierson 撰写了一系列关于编写IronPython调试器的博客文章,其中有很多细节.