2010-02-09 2 views
8

OK; en supposant que ce code s'exécute en mode débogage -Pourquoi ne puis-je obtenir aucun numéro de ligne d'une trace de pile créée à partir d'exceptions?

static StackFrame GetTopFrameWithLineNumber(Exception e) 
{ 
    StackTrace trace = new StackTrace(e); 
    foreach (StackFrame frame in trace.GetFrames()) 
    { 
     if (frame.GetFileLineNumber() != 0) 
     { 
      return frame; 
     } 
    } 
    return null; 
} 

Je retourne TOUJOURS la valeur null. Pourquoi les trames de la pile n'ont-elles pas de numéro de ligne alors que si j'inspecte la chaîne Exception.StackTrace, est-ce que cela est clair pour tout code non-framework? Y at-il un problème avec la construction d'une trace de pile à partir d'une exception dont je ne suis pas au courant?

EDIT FOR CLARITY: Dans l'exception levée, je peux voir les numéros de ligne dans la propriété StackTrace. Je suppose que cela signifie que j'ai tout ce dont j'ai besoin.

Répondre

16

Selon le code documentation on the StackTrace constructor overload that takes an exception, vous ne pouvez pas vous attendre à ce que des numéros de ligne soient créés lors de la création du StackTrace.

Le StackTrace est créé avec thread courant de l'appelant , et ne contient nom de fichier, le numéro de ligne ou de colonne informations.

Pour obtenir les numéros de ligne, vous devez utiliser the overload that takes a bool as well as the exception.

Vous avez également besoin de fichiers de symboles (pdb) pour les numéros de ligne. Les fichiers de symboles sont disponibles pour les deux déboguer et libérer des versions.

+0

Puis-je voir les numéros de ligne dans la chaîne exception.stacktrace mais cela ne signifie-t-il pas que j'ai le pdb? – Stimul8d

+0

Je ne pense pas qu'il s'agit d'un cas de pdb manquant car il est capable de voir les numéros de ligne. –

+0

ahh, donc c'est le cas; bon appel. – Stimul8d

Questions connexes