Le débogueur entrant dans le bloc if () où la condition est fausse

Étant donné ce joyau de code:

class Program { private static bool IsAdmin = true; static void Main(ssortingng[] args) { if (!IsAdmin) { throw new Exception(); } try { var x = 2342342; var y = 123132; } catch (Exception) { throw; } } } 

Étant donné le this.IsAdmin true – je m’attendrais à ce que le débogueur n’entre pas cette instruction if. En réalité, c’est le cas – et il saute le lancer sans le lancer!

À présent, cela ne se produit que lorsque vous avez une exception à l’intérieur d’une instruction if suivie d’un bloc try / catch sur Visual Studio 2013, ciblant .NET Framework 4, 64 bits, “Préférer 32 bits” non cochée.

J’ai confirmé cette bizarrerie avec des collègues sur différentes machines. Étape si le code suivant et le débogueur semblera passer dans la twig si, mais aucune exception n’est levée:

entrez la description de l'image ici

Je suis en mode débogage, j’ai essayé de comstackr et de nettoyer le projet plusieurs fois.

Quelqu’un peut-il expliquer pourquoi ceci est en train de se passer?

Voir le lien ci-dessous. C’est un bogue connu dans certaines versions de Visual Studio et de la version .NET Framework:

http://whileicomstack.wordpress.com/2010/07/02/visual-studio-bug-if-followed-by-a-try-catch-causes-debugger-stepping-error/

C’est complètement inoffensif et c’est quelque chose avec lequel vous devrez vivre.

Ceci est un problème connu causé par la gigue x64, il génère parfois des informations de numéro de ligne de débogage incorrectes. Cela peut tâtonner lorsqu’une instruction entraîne la génération d’instructions NOP supplémentaires destinées à aligner le code. Le premier NOP devient le numéro de ligne, au lieu de l’instruction après les NOP. Cet octet à quelques endroits, comme une instruction throw après un simple test if () et l’utilisation de la commande ?? opérateur avec des opérandes scalaires simples. Ces NOP d’alignement sont également la raison pour laquelle il est si dangereux d’abandonner les threads, décrits dans ce post .

La solution la plus simple est Projet + Propriétés, onglet Générer, cochez l’option “Préférer 32 bits” si disponible, définissez la cible de la plate-forme sur x86 sinon. Notez que rien ne se passe vraiment mal, alors que le débogueur suggère que l’instruction throw sera exécutée, votre programme ne lève pas d’exception.

On y travaille, la gigue x64 a été radicalement réécrite, un projet nommé RyuJIT. Il sera expédié dans VS2015, actuellement dans Preview.