StackOverflowException sans récursivité ou boucle infinie?

Arrière-plan

J'ai un DataGridView de contrôle qui je l'utilise, et j'ai ajouté mon gestionnaire ci-dessous pour les DataGridView.CellFormatting événement pour que les valeurs de certaines cellules peut être rendu plus lisible par l'homme. Ce gestionnaire d'événement a été génial de travailler, la mise en forme de toutes les valeurs sans problème.

Cependant, récemment, j'ai découvert de très rares circonstances, les causes d'un bug rare. La colonne dans mon DataGridView de l'élément date d'échéance a toujours un int valeur. 0 indique que l'événement n'est jamais en raison, toute autre valeur est UTC timestamp de la date d'échéance. La db MySQL colonne correspondante n'autorise pas les valeurs null. Lorsque l'utilisateur a déplacé d'un DataGridView ligne avec une date d'échéance, à un autre DataGridView ligne avec une date d'échéance (à ce stade, tout est semble toujours très bien), puis appuie sur un bouton qui recharge les données de la base de données (sans envoi de mises à jour, essentiellement l'appel DataAdapter.Fill()), le programme génère un StackOverflowException**.

Pas de récursivité?

Ce qui est inhabituel pour moi, c'est que je ne vois pas où la récursivité ou infinie-la boucle est. J'ai ajouté int cellFormatCallCount comme un membre de classe, et l'incrémenter lors de chaque appel, mais à l'époque, l'exception est levée, le débogueur affiche la valeur de ce int comme 1, ce qui je l'espère parce que je n'ai pas l'impression et la récursivité a été de se produire.

Quelqu'un peut-il m'aider?

Comment puis-je voir une trace de la pile? Dans VS2008 il dit:
{Cannot evaluate expression because the current thread is in a stack overflow state.}

Cordialement,

Robinson

private int cellFormatCallCount = 0;
private void myDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)  {
    try {
        //to format the cell, we will need to know its value and which column its in
        string value = "";
        string column = "";

        //the event is sometimes called where the value property is null
        if (e.Value != null) {
            cellFormatCallCount++; //here is my test for recursion, this class member will increment each call

            //This is the line that throws the StackOverflowException
            /* ********************* */
            value = e.Value.ToString();
            /* ********************* */

            column = actionsDataGridView.Columns[e.ColumnIndex].Name;
        } else {
            return; //null values cannont be formatted, so return
        }

        if (column == "id") {
            //different code for formatting each column
        } else if (column == "title") {
            //...
        } else {
            //...
        }
    } finally {
        cellFormatCallCount = 0; //after we are done with the formatting, reset our recursion counter
    }
}
Vous pouvez poster la trace de la pile? Ça aiderait beaucoup.
Je pensais que ce thread a propos de ce site web. Garçon, j'ai besoin d'une pause =p
Moi aussi! J'ai été à essayer de comprendre comment il a obtenu une exception à partir du site web. Sheesh!
Si vous mettez un point d'arrêt sur la ligne incriminée, pouvez-vous étape dans l'accès à la propriété de l'e.De la valeur? Pouvez-vous aperçu rapide de l'e.De la valeur? Si oui, que voyez-vous?
C'est un long shot, mais qu'est-ce que l'e.De la valeur? Si le ToString qui est définie de manière récursive, alors vous pourriez avoir un stackoverflow. Oui ça peut paraître fou, mais plus facile que vous pourriez penser, surtout quand vous avez un objet avec une propriété qui permet de faire un "jeu" avec le type d'Objet qui peut se contenir lui-même.

OriginalL'auteur gnirts | 2009-04-22