NullReferenceException上没有堆栈跟踪

时间:2015-10-28 13:23:39

标签: c#

当我在发布模式下从控制台运行时,我有一个以NullReferenceException终止的应用程序。它在调试模式或调试器中运行良好。 程序以以下输出终止:Unhandled Exception:System.NullReferenceException:对象引用未设置为对象的实例。

没有显示堆栈跟踪,也会弹出Visual Studio即时调试器对话框,但它也没有堆栈跟踪。

pdb文件存在。

如何让visual studio给我一个堆栈跟踪?

我尝试过设置AppDomain.CurrentDomain.UnhandledException,它不会捕获异常,也可以尝试/捕捉到处。

这是一个控制台应用程序,它使用csharp dll,而csharp dll又使用c ++ dll。

我知道NullReferenceException是什么,以及如何修复它 - 我找不到它

2 个答案:

答案 0 :(得分:2)

  

又使用c ++ dll

这就是问题所在。原生C ++代码也可以在" null引用"上失败,这是指针是一等公民的语言中非常常见的错误。它以完全相同的方式报告。有点不幸的是,应该是一个AccessViolationException,但CLR没有足够的选择性来限制只为托管代码将其转换为NRE。

是的,没有可用的堆栈跟踪。这就是使用C ++的代价,其主要原因是以诊断为代价尽可能快地生成代码。堆栈跟踪要求调用堆栈可以可靠地移动,这对托管代码来说是一项艰难的要求,因为CAS和垃圾收集器都依赖于能够查看堆栈帧。对于C ++编译器而言,不是免费的,可能是perf的几个百分点。

您需要使用调试器。使用Project>启用非托管调试器属性>调试选项卡>勾选"启用本机代码调试"复选框。如果要捕获此异常,则需要强制调试器在抛出时停止,Debug>例外>勾选" Win32 Exceptions"复选框。如果你不能在自己的机器上重新发生这次崩溃,那么你需要一个minidump,用DebugDiag生成一个。

答案 1 :(得分:0)

检查您使用的代码中是否有try catch块

catch (Exception ex)
{
   throw ex;
}

而不是

catch (Exception ex)
{
   throw;
}

第一个重置堆栈跟踪。请参阅 difference between throw and throw ex in c# .net