是否有任何以 VS 插件或独立应用程序形式存在的 IL 级调试器?
Visual Studio 的调试器很棒,但它允许您在 HLL 代码级别或汇编语言上进行调试,您无法调试 IL。似乎在某些情况下,有机会在 IL 级别进行调试会很有用。
特别是在调试您没有源代码的问题时,它可能会有所帮助。
当您没有源代码时调试 IL 是否真的有用是有争议的,但无论如何。
最好的方法是使用 ILDASM 反汇编托管二进制文件,这将生成 IL 指令。然后使用 ILASM 在调试模式下重新编译该 IL 源代码,当您启动 Visual Studio 调试器时,您将能够单步执行原始 IL。
ildasm foo.exe /OUT=foo.exe.il /SOURCE
ilasm foo.exe.il /DEBUG
我写了一篇关于这个主题的博客文章: 如何调试编译器生成的代码。
这是我用来在 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
Debug Companion VS 插件似乎正是我想要的,除了它在我的解决方案中看不到库项目。只有当我向解决方案添加控制台赢应用程序时,该项目列表中才会出现某些内容。
对我来说,反编译/编译方法的问题是我正在调试的代码不是我的代码。无论如何我都可以反编译它,但我认为没有办法签署重新编译的程序集,以便加载它而不是原始程序集。
对于特定的问题,我发现只需在汇编语言级别上对其进行调试并获取引发异常的方法的调用堆栈以及调用该方法的参数就足够了。
ISTR 有一个反射器的调试器插件。
虽然我使用 TestDriven.net 在 Reflector 的帮助下调试了第 3 方程序集,但我自己没有使用它:
这是一篇关于 IL 调试的文章。它说你不能这样做,然后谈论如何做到这一点。评论中也有一些关于这样做的信息。