【问题标题】:Debugger for MSIL or for exe-file created in .NET C#MSIL 或 .NET C# 中创建的 exe 文件的调试器
【发布时间】:2012-11-26 10:40:45
【问题描述】:

我需要调试一个用 .NET C# 编写的程序。

具体来说——我只需要查看函数调用后返回的内容。我发现我可以为此目的使用 Microsoft Visual Studio——它理解 IL。我使用 ILDASM 获得了该 exe 文件的源代码。比我获取 pdb 文件并使用 ILASM 从 IL 代码获取 exe 文件。但是原始的 exe 文件与我在 ILASM 之后得到的 exe 文件不同。

程序启动但我有 AccessViolation ц当我尝试执行该函数时,我需要查看其结果。程序没有被混淆。

我做错了什么或者我需要做什么才能获得成功的结果?

【问题讨论】:

    标签: .net debugging cil


    【解决方案1】:

    exe->il->exe 可能无法运行的原因有多种。除了您提到的那些(混淆的 IL)之外,还有一些可执行文件还包含本机代码,或者是(直接或间接)检查其自身签名的数字签名可执行文件。

    一些调试器可以单步执行 IL,而无需重新构建应用程序。就个人而言,我喜欢为此使用ILSpy。请注意,最新版本的二进制文件不包含调试所需的位,您需要为此从源代码构建它。

    另一种选择应该是 MDbg:Mike Stall 报告已将 IL 步进添加到 GUI back in 2005。我没有这方面的经验。

    【讨论】:

      【解决方案2】:

      hvd 已经解释了执行 exe -> IL -> exe 时可能出现的问题,我不再赘述。但是,我将给您一个提示,如何以非侵入性方式检查函数的返回值。首先你需要为你的项目启用原生调试器:

      C# 应用程序:

      ASP.NET:

      然后在方法的最后一行放置一个断点,打开即时窗口并输入(这需要在每个调试会话中执行一次):

      .load sos
      

      然后跳出函数(Shift+F11)并复制eax(或rax)注册表(Debug->Windows->Registers)的值。如果您的函数的返回类型是值类型(int、byte 等),则该值就在您的指尖(您可以将其粘贴到 Watch Window 以将其转换为十进制值)。如果它是参考值,则 e(r)ax 包含堆中对象的地址。要查看它,请返回即时窗口并输入:

      !do [你复制的 e(r)ax 值]

      对象将在即时窗口中显示其所有属性和字段。对于字符串,您还可以使用 Debug->Windows->Memory 窗口。

      【讨论】:

        【解决方案3】:

        几年前我使用过 DILE:http://sourceforge.net/projects/dile/,它让我在调试器中单步执行 IL 方面做得非常好。

        【讨论】:

          【解决方案4】:

          按照@Jason-Haley 的建议查看 Dile,我发现它已经过时并且不再构建。

          屏幕截图看起来很有希望,所以我恢复了旧的源代码,将其升级到 VS2107、NETFXSDK\4.7.2 和 Windows 10 SDK 工具包(该项目当前具有 Windows 依赖项)。

          在修复了一些错误并消除了一些编译器错误后,我设法让它工作并发布了一个新的 GIT 存储库。 https://github.com/alexhiggins732/DILE-MSIL-DEBUGGER

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多