2010-09-20 5 views
0

j'ai suivi cet exemple de la page Web Scott Hanselmans: http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspxdebug: différence entre pdbonly .Net 2 et .Net 4

Mon but est d'obtenir le numéro de ligne où l'exception est levée pas où il est pris.

Lorsque je compile le code avec le build-script suivant, il ne fonctionnera pas

SET FXROOT=%Systemroot%\Microsoft.NET\Framework\v4.0.30319 

DEL *.exe /q 

"%FXROOT%\csc.exe" /t:exe /out:NormalRelease.exe /debug:pdbonly /o+ NormalProgram.cs 

NormalRelease.exe > NormalRelease32.txt 

Sortie:

System.ApplicationException: generic bad thing 
    at NormalProgram.Main(String[] args) in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 8 

Lorsque je compile le code avec cette build-script, il fonctionnera

SET FXROOT=%Systemroot%\Microsoft.NET\Framework\v2.0.50727 

DEL *.exe /q 

"%FXROOT%\csc.exe" /t:exe /out:NormalRelease.exe /debug:pdbonly /o+ NormalProgram.cs 

NormalRelease.exe > NormalRelease32.txt 

Sortie:

System.ApplicationException: generic bad thing 
    at NormalProgram.badMethod() in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 18 
    at NormalProgram.Main(String[] args) in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 8 

La différence est que dans mon premier exemple, je compilé le .NET2-cadre, et dans mon deuxième exemple que je compilé le .net4-cadre.

Toutes les solutions à mon problème seraient appréciées, merci.

Répondre

2

C'est quelque chose que vous devrez faire si vous prévoyez de générer des numéros de ligne à partir du code généré dans la configuration Release. L'optimiseur du compilateur JIT est activé et il va déplacer le code pour créer un code machine plus efficace. Cela affectera l'exactitude du numéro de ligne signalé.

La solution spécifique est ici pour appliquer cet attribut à « badMethod »:

using System.Runtime.CompilerServices; 
... 
     [MethodImpl(MethodImplOptions.NoInlining)] 
     void badMethod() { 
      // etc... 
     } 

Ce n'est pas une solution joyeuse, inline est une optimisation importante, en particulier sur la propriété getter/setters. La raison pour laquelle il est différent entre .NET 2.0 et 4.0 est parce qu'ils ont différents jitters avec des règles différentes pour décider quand une méthode devrait être en ligne.

Questions connexes