【问题标题】:no stack trace on NullReferenceExceptionNullReferenceException 上没有堆栈跟踪
【发布时间】:2016-01-28 07:06:31
【问题描述】:

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

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

pdb 文件存在。

如何让 Visual Studio 给我一个堆栈跟踪?

我已经尝试设置 AppDomain.CurrentDomain.UnhandledException,它不会捕获异常,以及到处尝试/捕获。

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

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

【问题讨论】:

  • 在“Debug -> Exceptions -> C++ Exceptions”和“Common Language Runtime Exceptions”中设置“Thrown”复选框
  • Go old skool 并开始添加日志记录。作为一个控制台应用程序,它应该很容易为位置和对象添加写入行。
  • “内部异常”里面的东西?

标签: c#


【解决方案1】:

这又使用了一个 c++ dll

这就是问题所在。本机 C++ 代码也可能在“空引用”上失败,这是指针是一等公民的语言中非常常见的错误。它以完全相同的方式被报告。有点不幸,应该是 AccessViolationException,但 CLR 的选择性不足以限制将其转换为 NRE 仅用于托管代码。

是的,没有可用的堆栈跟踪。这就是使用 C++ 的代价,它存在的主要原因是尽可能快地生成代码,代价是诊断。堆栈跟踪要求调用堆栈可靠地可遍历,这对于托管代码来说是一个非常严格的要求,因为 CAS 和垃圾收集器都依赖于能够窥视堆栈帧。不是免费的,也许只有百分之几的性能,对于 C++ 编译器来说太多了。

您需要使用调试器。使用 Project > Properties > Debug 选项卡启用非托管调试器 > 勾选“Enable native code debugging”复选框。如果你捕捉到这个异常,那么你需要强制调试器在它被抛出时停止,Debug > Exceptions > 勾选“Win32 Exceptions”复选框。如果您无法在自己的机器上重现此崩溃,那么您需要一个小型转储,使用 DebugDiag 生成一个。

【讨论】:

    【解决方案2】:

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

    catch (Exception ex)
    {
       throw ex;
    }
    

    而不是

    catch (Exception ex)
    {
       throw;
    }
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2017-04-17
    相关资源
    最近更新 更多