编写 Iron Python 调试器

9
作为一个学习练习,我正在使用IronPython编写一个简单的扩展/插件/宏框架 - 我已经使基本功能正常工作,但我想添加一些基本的调试支持,以使我的脚本编辑器更易于使用。我在互联网上搜寻了一些资源,发现了一些关于编写托管调试器的好资源(包括Mike Stall的优秀的.Net Debugging blog和MSDN文档中的CLR Debugging API)- 我知道IronPython本质上是IL,但除此之外,我对如何入手有些困惑,特别是:
  • 调试动态语言(如IronPython)与静态语言(如C#)之间是否存在任何显着差异?
  • 我需要以特殊方式执行我的脚本才能使IronPython输出适当的调试信息吗?
  • 调试运行在当前进程中的脚本是否会导致死锁,或者IronPython会在子进程中执行我的脚本?
  • 我最好先研究如何制作一个简单的C#调试器以获得一般的思路吗?

我目前对于制作调试器的图形用户界面不感兴趣 - 我已经有了一个相当好的想法,关于如何实现它。


这个问题回答了我的一个问题:https://dev59.com/9HRB5IYBdhLWcg3wQVSV - Justin
3个回答

10
几个链接已经让这个问题变得更加清晰 - 我看到了两种添加调试器支持的方式:

将IronPython作为CLR应用程序进行调试

第一种方法是利用IronPython发出IL代码并使用用于调试.Net应用程序的标准技术进行调试。Harry Pierson在此方法上有一系列博客文章here,介绍了ipydbg的开发情况 - 一个使用此方法的Python调试器。
  • 请参见this post以获取有关.Net调试功能在何处公开以及各种包装程序(mdbg)的概述。
  • 此方法的缺点是这种形式的调试完全阻塞了正在调试的应用程序,因此您必须在第二个应用程序中执行脚本。

使用Microsoft.Scripting.Debugging

由于这种限制,取而代之的是生产了Microsoft.Scripting.Debugging库,它更适合运行IronPython“嵌入”(即在同一进程中)的应用程序。

这里介绍了它的概述,这里详细说明了它的使用方式 - 基本上它由一个回调函数组成,每当发生任何“有趣”的事情时都会执行它(每次我们进入函数、返回函数和执行一行代码时)。在回调函数运行时,脚本的执行会被阻塞,这使你可以“中断”脚本。

我决定采用第二种方法 - 如果我找到更多可能对其他人有帮助的信息,我将更新这篇文章。


6
我不是IronPython的专家,但我有一些使用WinDbg调试托管应用程序的经验。我简要地查看了IronPython应用程序在调试器中的外观。由于Python的动态性质,在运行时会生成大量代码。这使得调试IronPython应用程序比调试C#应用程序更加复杂,因为你可以说有一个额外的代码生成层。

Harry Pierson曾经深度参与过Iron语言的开发,并写了一系列关于编写IronPython调试器的博客文章,其中包含许多细节。

谢谢提供链接 - 我正在阅读它,看起来不错。 - Justin

0
在AlterNET Software(www.alternetsoft.com)中,我们已经实现了C#和IronPython的调试,并且我们发现主要的区别是对于C#调试,你不能真正将调试器和脚本被调试的部分作为同一进程的一部分。我们尝试了这里描述的一些技术,但并没有真正找到可靠的解决方法。

https://learn.microsoft.com/en-us/archive/blogs/jmstall/you-cant-debug-yourself

为了调试您的脚本,您需要使用独立调试器,或者编写脚本的方式使其可以在单独的可执行文件中编译(但这意味着为了访问应用程序定义的对象,该脚本将需要使用进程间通信技术与应用程序交互)。
您可以在此处找到更多信息: https://www.alternetsoft.com/news/known-issues-of-net-script-executing-and-debugging 动态语言(如IronPython)在这方面更加宽容 - 您可以在自己的进程中实现调试。
虽然正在调试的脚本需要在单独的线程中运行,因此如果需要访问应用程序对象,则应以线程安全方式处理 - 例如,使用Invoke调用UI线程的同步调用。通过在调试期间实现自己的消息循环,可能可以避免这种情况,但我们尚未尝试过。
​​Dmitry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接