【问题标题】:Debug a .NET EXE file that crashes immediately调试立即崩溃的 .NET EXE 文件
【发布时间】:2011-01-18 22:44:55
【问题描述】:

我正在处理一个运行时立即崩溃的托管 EXE 文件。通常我希望有一个对话框允许启动调试器的选项,但在这种情况下没有这样的运气。此外,程序崩溃太快,我无法在 Visual Studio 中使用附加处理。

解决办法是什么?

【问题讨论】:

  • 你有源代码吗?你试过在调试器中启动它吗?
  • 是否安装了所需的 .net 框架?您的代码是否有任何可以抛出的静态初始化程序?
  • 我有源代码,但我正在使用 ILMerge 来组合程序集,并且需要一种在调试器中启动 ILMerge 输出的方法。
  • 如果 ILMerge 崩溃,原因之一可能是其中一个程序集不完全是 .net,例如 SQLite DLL。

标签: .net debugging executable


【解决方案1】:

在调试器中启动它(F5Ctrl + Shift + B)。您应该能够设置任意断点(如在 main 函数中)并单步执行。

【讨论】:

    【解决方案2】:

    如果你安装了WinDbg,使用菜单FileOpen Executable直接在调试器下打开应用程序,并立即自动中断。

    然后可以使用Debug下的命令(即Go)正常执行并调试。同时加载SOS Extensions。不如 Visual Studio 好,但如果您只有 EXE(希望 PDB,尽管这是可选的)并且没有源代码,则很有用。

    示例:这是我的源代码,我们假设它不可用:

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            int x = 10 - 10;
            int i = 2000/x;
    
            Application.Run(new Form1());
        }
    

    这会立即崩溃,您没有机会及时附加调试器。这是点击“运行”后的 WinDbg 输出:

    删除了死掉的 ImageShack 链接 - 我的手绘圆圈

    加载 SOS.dll 后,您可以使用 !DumpStack 查看抛出异常的位置:

    删除了无效的 ImageShack 链接 - 没有手绘圆圈,抱歉!

    请注意,JIT 或编译器优化可能会导致方法被内联,这可能会使 StackTrace 不是 100% 可靠,但为了快速了解它的工作原理。

    WinDbg 有点神秘,但一旦你完成了一些基础知识,它就很棒了,至少有助于找到问题的根源。

    【讨论】:

      【解决方案3】:

      上面没有提到的另一个选项是插入一个

      Debugger.Break();
      

      程序一开始的声明 - 可能包含在#ifdef DEBUG 中,以便在构建发布时更容易跳过。我已经使用这种技术来调试早期崩溃的 Windows 服务。

      【讨论】:

      • Debugger.Break();正是我需要调试一个颠覆预提交挂钩 C# 控制台应用程序
      【解决方案4】:

      一个常见的原因是,如果在调用 Application.Run... 时创建的任何对象的构造函数中抛出异常...,如下所示:

      Application.Run(new MyForm());
      

      如果 MyForm 构造函数抛出异常,它通常会崩溃。

      还可以考虑使用Assembly Binding Log Viewer 来确定您是否缺少所需的程序集,或者是否存在版本控制问题。

      【讨论】:

        【解决方案5】:

        立即崩溃?

        我使用 ildasm 只是为了确保我有一个有效的(看起来)托管的可执行文件。

        另外,我已经被网络驱动器上的 .exe 和没有正确设置权限所困扰。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多