捕获仅在Release上发生的.NET错误,不会抛出任何异常

时间:2010-09-13 02:00:11

标签: c# visual-studio exception unmanaged

我目前正在目睹一个错误,只发生在我的exe的“释放”模式上。

因此,我没有附加调试器,应用程序只会“......已停止工作。”。

我最初的反应是在我的主循环中捕获任何和所有异常并显示它的消息,但结果没有抛出,程序崩溃了。 (我的程序是单线程的。)

这可能与我整合非托管代码的事实有关,但即便如此,为什么在发布模式下它会有所不同?有没有办法让我抓住这个例外?

我怀疑它是在调试器中运行时“无法显示堆栈跟踪/查找代码”的错误之一(并且实际上不会抛出异常),但我老实说无法测试它。建议SO?

6 个答案:

答案 0 :(得分:5)

即使它在发布模式下运行,您仍然可以将调试器附加到它。你可以试试像......

  • 编写程序,使其在执行开始时等待按键
  • 在发布模式下运行
  • 在等待按键
  • 时附加调试器
  • 调试它

然后看看会发生什么。如果它停止发生并在调试器下工作,即使在发布模式下运行,那么你有Heisenbug(基本上意味着很难找到这个bug)。

但是,如果它发生并且Visual Studio调试器在问题发生时中断,那么请查看“线程”窗口(我认为是Ctrl + Alt + H)。虽然您的应用程序只使用一个线程,但您运行的本机代码可能会启动自己的非托管线程。如果是这种情况,您可能会找到一种方法让它停止这样做,因为遗憾的是,无法在托管代码中捕获该异常。

答案 1 :(得分:1)

这可能是因为您正在使用try catch阻止某些地方

尝试以下步骤

1-转到Visual Studio IDE

2-选择调试选项

3-单击例外

4-检查后续投掷选项 'Common Language RunTime Exception'和Native Win 32 Exceptions

5-首先在DEBUG模式下运行代码。

6-检查你是否有例外。

这可能会解决您的问题,至少您将在DEBUG模式下获得异常。

答案 2 :(得分:1)

这里两分钱:

我最近在winforms应用程序中遇到了一个问题,我将收到异常“对象引用未设置为对象的实例”。这只发生在发布模式而不是调试模式。

我能够以有限的调试运行程序作为发布,并且可以看到所有变量。他们都没有任何问题。

无论如何,我只是将视觉工作室从版本15.7.1升级到15.7.3,问题就消失了。

答案 3 :(得分:0)

Release和Debug之间的内存布局会有所不同。堆栈的布局也可以不同。如果你有一个错误的非托管代码丢失内存,那么它会产生随机效果。

答案 4 :(得分:0)

您仍然可以从VS调试版本构建;先尝试一下。

如果托管代码和非托管代码的混合由于某种原因使其变得棘手,您可以尝试将WinDbg与SOS和SOSEX扩展一起使用。请参阅我的答案here以了解所需的基本步骤 - 并检查您是否也为发布版本生成了PDB符号。

答案 5 :(得分:0)

我认为最好先隔离测试非托管代码。

如果成功,那么问题可能是将非托管代码集成到托管代码或托管代码本身。