StackOverflowException ohne Rekursion oder Endlosschleife?

8

Hintergrund

Ich habe eine DataGridView -Steuerung, die ich verwende, und ich habe meinen Handler unten zum DataGridView.CellFormatting -Ereignis hinzugefügt, damit die Werte in einigen Zellen besser lesbar gemacht werden können. Dieser Event-Handler funktioniert einwandfrei und formatiert alle Werte ohne Fehler.

Vor kurzem habe ich jedoch einen sehr seltenen Umstand entdeckt, der einen ungewöhnlichen Fehler verursacht. Die Spalte in meinem DataGridView für das Fälligkeitsdatum des Elements hat immer den Wert int . 0 gibt an, dass das Ereignis nie fällig ist, jeder andere Wert ist ein UTC-Zeitstempel für das Fälligkeitsdatum. Die entsprechende MySQL db-Spalte erlaubt keine Nullen. Wenn der Benutzer von einer DataGridView -Zeile mit einem Fälligkeitsdatum in eine andere DataGridView -Zeile mit Fälligkeitsdatum gewechselt ist (zu diesem Zeitpunkt ist noch alles in Ordnung), und drückt dann eine Schaltfläche, die die Daten aus der Datenbank lädt ( Ohne das Senden von Updates, im Wesentlichen Aufruf von DataAdapter.Fill() ), generiert das Programm eine StackOverflowException **.

Keine Rekursion?

Was mir so ungewöhnlich ist, ist, dass ich nicht sehe, wo die Rekursion oder Infinite-Schleife ist. Ich habe int cellFormatCallCount als Klassenmitglied hinzugefügt und bei jedem Aufruf inkrementiert, aber zu dem Zeitpunkt, zu dem die Ausnahme ausgelöst wird, zeigt der Debugger den Wert von int als 1 an, was ich erwarten würde, da ich nicht unter der Eindruck und Rekursion traten auf.

Kann mir jemand helfen?

Wie kann ich eine Stapelverfolgung anzeigen? In VS2008 heißt es: {Cannot evaluate expression because the current thread is in a stack overflow state.}

Mit freundlichen Grüßen

Robinson

%Vor%     
gnirts 22.04.2009, 20:05
quelle

7 Antworten

5

Anscheinend ruft e.Value.ToString () das CellFormatting-Ereignis erneut auf. Das scheint etwas logisch zu sein. Es sollte leicht genug sein, dies mit einem Debugger herauszufinden.

Aber die tatsächliche Rekursion könnte irgendwo anders verursacht werden, wie in der pro-Spalten-Formatierung, die Sie weggelassen haben.

Ihre Rekursionsprüfung ist nicht zuverlässig, da Value == null sie ebenfalls zurücksetzt und von allen Spalten geteilt wird. Machen Sie es e.Value.ToString () dichter:

%Vor%     
Henk Holterman 23.04.2009, 03:43
quelle
2

Völlig zufälliges Raten (ohne Stack-Trace ist das alles, was ich tun kann) ...

Versuchen Sie, einen Typ anzuzeigen / zu formatieren, der möglicherweise eine rekursive ToString() hat?

%Vor%

Ein Tippfehler / Fehler könnte einen StackOverflowException ...

verursachen     
Daniel LeCheminant 22.04.2009 20:11
quelle
1

Wenn dies ein Ereignis ist, könnte es sich selbst auslösen?

    
BCS 22.04.2009 20:18
quelle
1

Versuchen Sie, die Variable cellFormatCallCount so festzulegen, dass sie von allen Instanzen der Klasse gemeinsam genutzt wird. Ich vermute, dass das Ereignis sich selbst auslöst, aber Sie sehen es nicht, weil cellFormatCallCount nur lokal für jede Instanz der Klasse ist, die das Ereignis behandelt, und wird daher nie über 1 hinaus erhöht. Wenn dies der Fall ist, dann der eigentliche Auslöser für den Stackoverflow (Rekursion) könnte irgendwo in der Methode sein und es passiert einfach, dass der Stapelraum an dieser Zeile ausgeht.

Sobald Sie die Variable statisch gemacht haben, können Sie eine Ausnahme auslösen, wenn sie einen bestimmten (kleinen) Wert wie 2 überschreitet. Diese Ausnahme sollte eine sichtbare Stapelspur hinterlassen.

    
tvanfosson 22.04.2009 20:24
quelle
1

@Daniel: Wenn das das Problem wäre, würde es nicht schon die Ausnahme in der Zeile auslösen:

%Vor%

@gnirts: Könnten Sie auch die vollständige Methode und Stack-Trace veröffentlichen?

@BCS (unten): Ich denke, das könnte es sein, aber es könnte leicht in etwas Code sein, der nicht im Deo gepostet wird.

PS. Es tut mir leid, das hätte ein Kommentar sein sollen, aber ich habe nicht genug Wiederholungen :-D

    
asgerhallas 22.04.2009 20:16
quelle
0

Es hat nichts mit dem Problem zu tun, aber Sie können tatsächlich eine StackOverflowException ohne Rekursion haben, nur mit:

%Vor%     
Mehrdad Afshari 22.04.2009 20:14
quelle
0

Ich habe gerade ein ähnliches Problem mit stackoverflow ohne Spuren Details gehabt.

Mein Problem lag an einer Instanz eines Objekts, das nicht instanziiert werden sollte. Ich entfernte das störende neue Objekt und alles war in Ordnung.

Wenn Sie oben keinen weiteren Code sehen, stellen Sie sicher, dass mehrere Ereignisse nicht mit dem Zeichen "=" ausgelöst werden, um die Ereignisse entsprechend abzubrechen.

Ich hoffe, das könnte jemandem helfen.

    
peterincumbria 11.01.2012 13:24
quelle