如何使用IronPython shell扩展Visual Studio调试器?

Dar*_*mas 6 c# debugging visual-studio-2010

首先我要解决的问题是:我正在调试一个具有巨大对象图的C#应用​​程序(想想建筑信息模型,一种面向对象的CAD).当我遇到一个断点时,我通常会有很长的对象列表,我首先需要将其转换为对调试有用.

在代码中,我使用LINQ和lambdas来执行此操作.但是你不能在Watch窗口和Immediate窗口中这样做.

我怎样才能在Visual Studio 2010中添加IronPython shell扩展,让我可以窥探立即窗口/监视窗口可用的相同信息?

编辑:我可以弄清楚如何制作调试器可视化工具.但是从API看起来我只能访问可视化的对象 - 而我实际上更喜欢访问所有局部变量.

编辑:msdn上的文档看来,具有EE(表达式评估器?)的DE(调试引擎)可以做到这一点.这是为了将您自己的语言集成到Visual Studio中.我试图挂钩现有的DE或者至少提供我自己的EE.

Mat*_*les 1

我不知道这是否有帮助,但是有一个关于在托管代码中编写调试器和扩展的好系列:

\n\n

http://devhawk.net/blog/2009/2/27/writing-an-ironpython-debugger-mdbg-101

\n\n
\n

在开始编写任何调试器代码之前,我认为快速查看可用的 .NET 调试器基础结构以及 MDbg 命令行调试器的设计会有所帮助。请注意,我对这个东西的理解相当初级 \xe2\x80\x93 Mike Stall 是 \xe2\x80\x9cda\n man\xe2\x80\x9d 如果你\xe2\x80\x99正在寻找 .NET调试器博主必读。

\n\n

CLR 提供了一系列非托管 API,用于托管 CLR、读取和写入 CLR 元数据以及与我们当前讨论更相关的 xe2x80x93 调试以及读取和写入调试器\n 符号。这些 API 作为 COM 对象公开。CLR 调试 API 允许您执行您期望在调试器中执行的所有操作:附加到进程(实际上是应用程序域)、创建断点、单步执行代码等。当然,作为一个非托管 API,\n\xe2\x80\x99 几乎无法从 IronPython 中使用。幸运的是,MDbg\n 为我们封装了这个非托管 API,使其可用于任何托管\n 语言,包括 IronPython。

\n\n

MDbg 的基本设计如下所示:

\n\n

图像

\n\n

底部是 \xe2\x80\x9craw\xe2\x80\x9d 程序集,其中包含非托管调试器 API \n 的 C# 定义 \xe2\x80\x93 基本上以 ICorDebug 和 ICorPublish 开头的任何内容。Raw 还定义了一些元数据 API,\n 因为 \xe2\x80\x99 决定了类型信息如何暴露给调试器。

\n\n

下一个级别是 \xe2\x80\x9ccorapi\xe2\x80\x9d 程序集,我将其称为\n 低级托管调试器 API。这是一个相当薄的层,\n 将非托管范例转换为托管代码开发人员更容易接受的东西。例如,COM 枚举器(如 ICorDebugAppDomainEnum)被公开为 IEnumerable 类型。此外,托管回调接口会作为 .NET 事件公开。\xe2\x80\x99 并不完美\xe2\x80\x93 代码是用 C# 1.0 风格编写的,因此没有泛型\n 或收益。

\n\n

其中 corapi 是低级 API,\xe2\x80\x9cmdbgeng\xe2\x80\x9d 是高级托管调试器 API。正如您所期望的,它包装了低级 API 并提供了常见操作的自动实现。例如,该层维护一个断点列表,以便您可以在加载相关程序集之前创建断点。然后,当加载程序集时,它会遍历未绑定​​断点列表以查看是否可以绑定任何断点。它也是自动创建主入口断点的层。

\n\n

最后,在顶部我们有 MDbg 应用程序本身,以及任何 MDbg 扩展(在上图中由 \xe2\x80\xa6 表示)。mdbgext 程序集定义 MDbg.exe 和扩展程序集之间共享的类型。MDbg 有一些很酷的扩展 \xe2\x80\x93 ,包括 \n IronPython 扩展 \xe2\x80\x93 但现在我\xe2\x80\x99m 专注于构建尽可能轻量的东西,所以我\xe2\x80 \x99m 将放弃可扩展性\n 机制,至少现在是这样。

\n\n

我最初的原型是针对高级 API 编写的。这种方法有两个问题。首先是高级 API 中不支持 Just My Code。正如我在上一篇文章中提到的,JMC 支持对于这个项目至关重要。添加 JMC\n 支持并不困难,但我\xe2\x80\x99m 试图对 MDbg 源进行尽可能少的更改\n,因为我\xe2\x80\x99m 对分叉和不感兴趣\n 维护该代码。其次,虽然低级 API 提供了基于事件的 API(OnModuleLoad、OnBreakpoint、OnStepComplete 等),但高级 API 提供了更加面向控制台的循环 API。我发现事件驱动的 API 更易于使用,并且我认为如果我构建 ipydbg 的 GUI 版本,它会工作得更好。所以我\xe2\x80\x99ve\n决定使用低级API(又名corapi)。

\n\n

我上面提到过,我\xe2\x80\x99不想更改 MDbg 源,但我\n确实做了一个小更改。将 corapi 和 raw 分离为两个单独的程序集是早期版本 MDbg 的过时工件。因此我决定将这两个组合成一个名为\n CorDebug 的程序集。除了对程序集级别属性进行一些简单的清理以使单个程序集成为可能之外,我根本没有更改源代码。

\n
\n