IL 级代码调试器

IL level code debugger

提问人:axk 提问时间:8/13/2008 最后编辑:Stuaxk 更新时间:7/22/2017 访问量:11545

问:

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

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

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

当你没有源代码时,调试 IL 是否真的有用,这是有争议的,但无论如何。

.NET 调试 il

评论


答:

25赞 Chris Smith 8/13/2008 #1

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

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

我写了一篇关于这个主题的博客文章:如何调试编译器生成的代码

评论

5赞 axk 9/11/2008
这是一个很好的方法,但不能将其用于已签名的程序集。
0赞 Aydin Homay 11/22/2023
@Chris我没有罚款你提到的博客文章“如何调试编译器生成的代码”
0赞 Will Dean 8/13/2008 #2

ISTR:有一个用于 Reflector 的调试器插件。

我自己没有使用它,尽管我已经使用 TestDriven.net 在 Reflector 的帮助下调试了第 3 方程序集:

weblogs.asp.net/nunitaddin

0赞 bruceatk 8/13/2008 #3

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

1赞 axk 8/20/2008 #4

Debug Companion VS 插件似乎正是我想要的,只是它不会在我的解决方案中看到库项目。只有当我将控制台 win 应用程序添加到解决方案中时,才会在该项目列表中显示某些内容。

对我来说,反编译/编译方法的问题在于我正在调试的代码不是我的代码。无论如何我都可以反编译它,但我认为没有办法对重新编译的程序集进行签名,以便加载它而不是原始程序集。

对于我遇到的特定问题,事实证明,只需在汇编语言级别对其进行调试并获取抛出异常的方法的调用堆栈以及调用该方法的参数就足够了。

3赞 BSalita 4/25/2015 #5

下面是我用于在 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赞 Shahzad Qureshi 4/25/2015
是否在 Visual Studio 环境中的生成后步骤中运行此步骤?
1赞 BSalita 4/25/2015
目前我从命令行调用。但是,我看不出它不起作用的任何技术原因。IIRC,我已经在构建后步骤中进行了测试,并且它按预期工作。
2赞 Adassko 4/30/2016
您可以替换并删除第一行%NAME_ONLY%%~dpn1