Я получаю исключение NullReferenceException при запуске моего многопоточного приложения, но только когда я запускаю режим 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» не является нулевым, и я также попытался изменить foreach на a for, если IEnumerator делает что-то смешное, но исключение происходит в одной строке.
Любые идеи о том, как исследовать это дальше?
Обновление: Несколько респондентов предложили возможные решения, связанные с обеспечением того, чтобы регистратор не был пустым. Чтобы быть ясным, заявления о регистрации были добавлены для целей отладки после того, как началось исключение.
Может содержать код функции здесь? Может быть, легче определить, что происходит. –
> «Возможно ли, что стек поврежден ...?»
re "eleven" не регистрируется - возможно, это просто не краснеет? –