Question Pourquoi ne pas objecter les exceptions d'erreur de référence dans .net me dire quel objet était nul?


Peut-être que poser la question trahit mon manque de connaissance du processus, mais là encore, il n’ya pas de meilleure raison de demander!

Le suivi de ces problèmes peut être frustrant, car les traces de pile peuvent m'aider à savoir par où commencer, mais pas quel objet est nul.

Qu'est-ce qui se passe sous le capot ici? Est-ce parce que les noms de variables ne sont pas regroupés dans l'exécutable?


12
2018-01-07 14:23


origine


Réponses:


Code .NET construit avec des optimisations complètes et aucune information de débogage: vos noms de variables locales ont disparu, certaines variables locales peuvent avoir été complètement éliminées.

Code .NET construit avec optimisations complètes + PDB (ou débogage complet): la plupart des noms de variables locales ont été préservés, certaines variables locales peuvent avoir été éliminées

Aucune optimisation + aucune information de débogage: les noms de variables locales ont disparu.

Et puis nous devons considérer que tout ce que vous traitez peut ne pas être dans une variable locale - cela pourrait être le résultat d'un appel de fonction précédent, sur lequel vous enchaînez un nouvel appel de fonction.


5
2018-01-07 14:46



Fondamentalement, vous avez répondu à votre propre question. Lorsque vous compilez du code, il est transformé en langage intermédiaire (IL). IL n'a pas de nom de variable comme le fait votre code, les arguments d'une méthode appelée sont poussés sur une pile avant que la méthode soit appelée et les arguments des méthodes courantes et les variables locales y sont référencés par leur position. Je crois que c'est parce que cette structure aide le compilateur JIT à générer du code.

Le fichier de symboles pdb stocke un mappage entre l'IL généré et votre code. Il est utilisé pour vous indiquer à quelle ligne de votre code se réfère chaque appel de méthode dans la pile d'appels. Peut-être que les informations stockées ici ne sont pas suffisamment détaillées pour indiquer quelle variable est nulle ou peut-être simplement considérée comme trop coûteuse en termes de perf pour pouvoir le faire. Dans tous les cas, si vous avez autorisé le compilateur à optimiser l'IL généré, il se peut qu'il n'y ait plus de correspondance un à un entre les variables de l'IL et les variables de votre code.

J'espère que cela pourra aider, Rob


1
2018-01-07 14:45



Il n'y a pas "d'identifiant d'objet". Il est impossible que .NET puisse dire "l'objet avec l'identifiant xxxx est nul".

Vous apprendrez à ne pas faire ces erreurs, ne vous inquiétez pas. Il suffit de diviser vos expressions en morceaux plus petits et vous trouverez les objets que vous avez oublié d'initialiser. Vous apprendrez à les initialiser dans ce scénario, et après un certain temps, cette affaire ne se reproduira plus.


0
2018-01-07 14:45