作为一个学习练习,我正在使用IronPython编写一个简单的扩展/插件/宏框架 - 我已经掌握了基础知识,但我想添加一些基本的调试支持,以使我的脚本编辑器更易于使用
我一直在互联网上搜索一下,我在编写托管调试器时找到了一些很好的资源(包括Mike Stall的优秀.Net Debugging blog和CLR Debugging API上的MSDN文档。 - 我知道IronPython本质上是IL,但除此之外,我有点迷失在如何开始,特别是:
(我现在对制作调试器的GUI方面不感兴趣 - 我已经非常了解这可能如何工作)
答案 0 :(得分:9)
还有一些链接已经开始变得更加清晰了 - 有两种方法可以添加我已经看到的调试器支持:
首先是使用IronPython发出IL并使用用于调试.Net应用程序的标准技术对其进行调试的事实。关于ipydbg(一种使用这种方法的python调试器)的开发,有一系列关于这种方法的博客文章由Harry Pierson撰写here。
由于此限制,生成了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 线程使用同步调用。在调试过程中实现自己的消息循环可能可以避免这种情况,但我们还没有尝试过(还没有)。
德米特里