我正在使用托管的EXE文件,该文件在运行时会立即崩溃。通常我会期望一个允许选项启动调试器的对话框,但在这种情况下没有这样的运气。此外,程序崩溃太快,我无法在Visual Studio中使用附加进行处理。
解决方案是什么?
答案 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 )。您应该能够设置一个任意断点(就像在主函数中一样),然后单步执行。