Ich erhalte eine NullReferenceException, wenn meine Multithread-Anwendung ausgeführt wird, aber nur, wenn ich im Freigabe-Modus außerhalb des Debuggers ausgeführt werde. Der Stack-Trace wird protokolliert und verweist immer auf denselben Funktionsaufruf. Ich habe mehrere Logging-Anweisungen in die Funktion geschrieben, um zu versuchen, zu bestimmen, wie weit es gehen würde, und jede Anweisung wird protokolliert, einschließlich einer in der letzten Zeile der Funktion. Interessant ist, dass, wenn die Nullreferenceexception auftritt, wird die Anweisung nach dem Funktionsaufruf nicht protokolliert werden:NullReferenceException, wenn Funktion zurückgibt
// ...
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
}
Die Ausnahme nicht jedes Mal tritt die Funktion aufgerufen wird. Ist es möglich, dass der Stapel entweder vor oder während der Ausführung der Funktion beschädigt wird, sodass die Rücksendeadresse verloren geht, was zur Nullreferenz führt? Ich hätte nicht gedacht, dass sowas unter .NET möglich ist, aber ich denke, es sind merkwürdigere Dinge passiert.
Ich habe versucht, den Aufruf der Funktion mit dem Inhalt der Funktion zu ersetzen, so Inline alles geschieht, und die Ausnahme auftritt dann auf einer Linie, die wie folgt aussieht:
foreach (ClassItem item in classItemCollection)
ich durch Protokollierung vergewissert haben, dass Die "classItemCollection" ist nicht null, und ich habe auch versucht, die foreach zu einem for zu ändern, falls der IEnumerator etwas Lustiges macht, aber die Ausnahme tritt in der gleichen Zeile auf.
Irgendwelche Ideen zur weiteren Untersuchung?
Aktualisierung: Mehrere Antwortende haben mögliche Lösungen vorgeschlagen, die damit zu tun haben, sicherzustellen, dass der Logger nicht null ist. Um dies klarzustellen, wurden die Protokollierungsanweisungen zu Debugzwecken hinzugefügt, nachdem die Ausnahme ausgelöst wurde.
Kann der Code der Funktion hier enthalten sein? Könnte es leichter machen zu erkennen, was passiert. –
> "... ist es möglich, dass der Stapel beschädigt wird ...?"
re "eleven" wird nicht protokolliert - vielleicht wird es gerade nicht geleert? –