当我在多线程应用程序中运行Release模式时,我遇到了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"不是null,我也尝试将foreach更改为for,以防IEnumerator做了一些奇怪的事情,但异常发生在同一行。
有什么想法可以进一步调查这个问题吗?
更新:几位回答者建议可能的解决方案与确保记录器不为null有关。 请注意,日志记录语句是在异常开始发生后添加的,用于调试目的。