2008-08-12 84 views
22

是否有VS插件或独立应用程序形式的任何IL级调试器?IL级代码调试器

Visual Studio的调试器非常棒,但它允许您在HLL代码级别或汇编语言上调试,但不能调试IL。 似乎在某些情况下,有机会在IL级别进行调试会很有用。

特别是,在代码中调试问题时可能会有所帮助。

这是有争议的,如果它实际上是有用的调试IL当你没有源,但无论如何。

回答

19

执行此操作的最佳方法是使用ILDASM反汇编托管二进制文件,该二进制文件将生成IL指令。然后使用ILASM以调试模式重新编译IL源代码,当您启动Visual Studio调试器时,您将能够遍历原始IL。

  1. ildasm foo.exe /OUT=foo.exe.il /SOURCE
  2. ilasm foo.exe.il /DEBUG

我已经写了一篇博客文章,在这个话题: How to debug Compiler Generated code

+2

这是一种很好的方法,但不能用于签名程序集。 – axk 2008-09-10 20:27:09

0

ISTR有一个反射器的调试插件。

没有用它自己,虽然我已经使用TestDriven.net调试一个第三方组件,反射器的帮助:

weblogs.asp.net/nunitaddin

0

这里是一个article约IL调试。它说你不能这样做,然后谈论如何做到这一点。关于这样做的评论也有一些信息。

1

Debug Companion VS插件似乎正是我所寻找的,除了它不会在我的解决方案中看到库项目。只有当我向解决方案添加控制台获胜应用程序时,才会在项目列表中出现一些内容。

对我来说,反编译/编译方法的问题是我调试的代码不是我的代码。我可以反编译它,但我认为没有办法签署重新编译的程序集,以便它被加载而不是原来的。

由于我遇到了特殊的问题,只是在汇编语言级调试它并获得抛出异常的方法的调用堆栈以及调用该方法的参数就足够了。

1

这里是我用来在Visual Studio中调试IL汇编程序的.BAT文件。创建的.IL.IL文件包含原始源代码行和生成的IL汇编器行,但不显示jitted机器代码。我将批处理文件命名为ILDEB.BAT,并将其作为“ILDEB mypgm”进行调用。我使用IL汇编程序指令“break”来强制Visual Studio调试器在命中时断点。

for /f "tokens=1 delims=." %%1 in ("%1") do set NAME_ONLY=%%1 
@erase/q %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
ildasm /out:%NAME_ONLY%.il.il /source /nobar %NAME_ONLY%.dll 
@if not exist %NAME_ONLY%.il.il goto quit 
ilasm /dll /debug /out=%NAME_ONLY%.dll %NAME_ONLY%.il.il 
@if not exist %NAME_ONLY%.dll goto quit 
peverify %NAME_ONLY%.dll 
:quit 
+0

您是否在Visual Studio环境中的后期构建步骤中运行此操作? – 2015-04-24 22:07:20