编写Iron Python调试器

时间:2010-03-22 15:38:01

标签: clr debugging ironpython

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

我一直在互联网上搜索一下,我在编写托管调试器时找到了一些很好的资源(包括Mike Stall的优秀.Net Debugging blogCLR Debugging API上的MSDN文档。 - 我知道IronPython本质上是IL,但除此之外,我有点迷失在如何开始,特别是:

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

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

3 个答案:

答案 0 :(得分:9)

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

将IronPython调试为CLR应用程序

首先是使用IronPython发出IL并使用用于调试.Net应用程序的标准技术对其进行调试的事实。关于ipydbg(一种使用这种方法的python调试器)的开发,有一系列关于这种方法的博客文章由Harry Pierson撰写here

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

使用Microsoft.Scripting.Debugging

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

它有一个介绍here和一篇关于它如何使用here的更广泛的博客文章 - 本质上它包含一个回调函数,每当“有趣”发生时执行(每次都会执行)我们每次从函数返回并且每次执行一行时都输入一个函数。在回调函数运行时,脚本的执行被阻止,这允许您“中断”脚本。

我决定采用第二种方法 - 我会更新这篇文章,因为我发现了更多可能有助于其他人尝试这样做的信息。

答案 1 :(得分:6)

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

曾经大量参与铁语言开发的Harry Pierson在writing an IronPython debugger上发布了一系列博客文章,其中有很多细节。

答案 2 :(得分:0)

在 AlterNET Software (www.alternetsoft.com),我们为 C# 和 IronPython 实现了调试,我们发现主要区别在于,对于 C# 调试,您不能真正将调试器和脚本作为调试的一部分同样的过程。我们尝试了此处描述的几种技术,但无法真正使其以可靠的方式工作。

https://docs.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 线程使用同步调用。在调试过程中实现自己的消息循环可能可以避免这种情况,但我们还没有尝试过(还没有)。

德米特里