【问题标题】:Getting the variable name for NullReferenceException获取 NullReferenceException 的变量名
【发布时间】:2016-03-30 06:52:25
【问题描述】:

NullReferenceException 的堆栈跟踪信息非常少,它们只包含方法名称和调用堆栈。方法中的任何变量都可以为 null,并且当错误在开发机器上无法重现时,很难调试。

您是否知道一种获取有关该错误的更多信息的方法,例如获取变量名?还是有更好的调试方法?

【问题讨论】:

  • 无法获取变量名。您可以确定发生异常的行。
  • @Alex 是的,但在生产中需要分发 .pdb 文件。这也防止了混淆器的使用。
  • @Elmo 祝你好运。如果您使用混淆器,堆栈跟踪将是垃圾。
  • @AaronCarlson 我的混淆器让我可以将堆栈跟踪转换回真实名称。它不会修改程序结构,只是重命名所有内容。
  • 取决于您使用的混淆器,如果您一直保存从混淆器生成的 PDB,您应该能够远程调试正在运行的代码。

标签: c# .net vb.net debugging nullreferenceexception


【解决方案1】:

跟踪该名称并不总是可能的(它可能是一个表达式)。
在可能的情况下,它会产生不可接受的开销。考虑到运行时必须跟踪几乎所有的引用变量,这将是昂贵的并且会禁止各种优化。

另请参阅我在 Inspect the managed stack 上的回答以及它所指的博客文章。

简单的解决方案是在您自己的代码中构建更一致的 null 检查:

void Foo(Bar b)
{
   if (b == null) throw new ArgumentNullException(nameof(b));

   ...
}

【讨论】:

  • 如果您包含Debug.AssertNonNull(或任何应有的名称)仅用于稍后调试时的完整性检查,则特别有用。
  • 调试状态下的开销是什么问题?
  • 添加显式 null 检查和 nameof 调用如何产生巨大开销?你是说尺寸优化吗?如果它只是一个编译标志,我宁愿控制那个选择。这是微软决定什么对我们重要的托管平台的大问题。为了控制大型对象堆收集,我们不得不竭尽全力。我们被禁止对此做任何事情,因为微软以其无限的智慧认为“功能”在 YEARS 中是不必要的。还不够好。我有空间。我想要这个选项。
  • 作为附加说明,如果您使用 JetBrains.Annotations 和 ReSharper,有一个(可选)键盘快捷键!和 ?添加NotNullCanBeNull 属性(分别),然后重新点击“!”在具有 notnull 属性的参数上自动添加此非常 nullcheck,因此您无需自己编写。
猜你喜欢
  • 2012-11-13
  • 2021-04-10
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多