运行我的多线程应用程序时,我收到 NullReferenceException,但仅当我在调试器之外以发布模式运行时。堆栈跟踪被记录下来,它总是指向同一个函数调用。我在函数中放置了几个日志语句来尝试确定它会走多远,并且每个语句都会被记录,包括函数最后一行的一个语句。有趣的是,当 NullReferenceException 发生时,函数调用之后的语句不会被记录:
// ...
logger.Log( "one" ); // logged
Update( false );
logger.Log( "eleven" ); // not logged when exception occurs
}
private void Update( bool condition )
{
logger.Log( "one" ); // logged
// ...
logger.Log( "ten" ); // logged, even when exception occurs
}
每次调用函数时都不会发生异常。堆栈是否有可能在函数执行之前或执行过程中被破坏,导致返回地址丢失,导致空引用?我不认为在.NET 下这种事情是可能的,但我猜奇怪的事情已经发生了。
我尝试用函数的内容替换对函数的调用,所以一切都在内联发生,然后异常发生在如下所示的行上:
foreach ( ClassItem item in classItemCollection )
我通过日志验证了“classItemCollection”不为空,并且我还尝试将 foreach 更改为 for,以防 IEnumerator 做一些有趣的事情,但异常发生在同一行。
关于如何进一步调查的任何想法?
更新:一些响应者提出了与确保记录器不为空有关的可能解决方案。需要明确的是,在异常开始发生后添加了日志语句用于调试目的。