调试立即崩溃的.NET EXE文件

时间:2010-02-19 20:15:50

标签: .net debugging executable

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

解决方案是什么?

5 个答案:

答案 0 :(得分:14)

如果安装了WinDbg,请使用菜单文件打开可执行文件直接在调试器下打开应用程序并立即自动中断。

然后,您可以使用 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有点神秘,但是一旦你完成了一些基础工作,那就太棒了,至少有助于找到问题的根源。

答案 1 :(得分:3)

上面未提及的另一个选项是插入

Debugger.Break();
程序一开始的

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

答案 2 :(得分:2)

立即崩溃?

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

另外,我在网络驱动器上安装了.exe并且没有正确设置权限,我被咬了几次。

答案 3 :(得分:2)

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

Application.Run(new MyForm());

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

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

答案 4 :(得分:1)

在调试器中启动它( F5 Ctrl + Shift + B )。您应该能够设置一个任意断点(就像在主函数中一样),然后单步执行。