10
votes

Comment puis-je dire au compilateur d'ignorer une méthode dans les traces de pile?

Y a-t-il des attributs que je peux appliquer aux méthodes de la chaudière afin que de telles méthodes n'apparaissent pas dans les traces de pile? J'en ai beaucoup et dans certains cas, ils sont plusieurs niveaux profonds. Il s'agit juste d'encombrer des choses.

Exemple code: P>

class Program
{
    public static void ThrowMe()
    {
        throw new NotImplementedException();
    }

    public static void HideMe()
    {
        ThrowMe();
    }
    static void Main(string[] args)
    {
        try
        {
            HideMe();
        }
        catch (Exception e)
        {

        }
    }
}


2 commentaires

Ce que vous demandez est quelque chose qui convient parfaitement dans certains cas et un cauchemar dans d'autres. Imaginez que quelqu'un d'autre lisait votre trace de pile et a vu que principal appelé throthme () . Ensuite, ils enquêtent sur principal mais ne peuvent pas voir où cet appel est fait. En outre, imaginez principal est de 500 lignes de sorte que ce n'est pas aussi évident que votre échantillon. Je sympathise avec vous, mais finalement, cette "caractéristique" serait maltraitée et que le codage serait un cauchemar, c'est pourquoi cela n'existe pas.


Est-ce que cela répond à votre question? Comment masquer la méthode actuelle à partir d'une exception Trace de pile dans .NET?


3 Réponses :


5
votes

Vous pouvez utiliser le déboggerHadkaTribute


3 commentaires

Cela empêche le débogueur de briser des exceptions attrapées dans ce député, mais cela affecte-t-il la trace de la pile?


Il s'avère que cette réponse était correcte. Hans l'époque plus en détail.


Cet attribut fonctionne à merveille pour avoir caché des méthodes d'emballage du débogueur. Ils n'apparaissent pas dans la CallStack, entrant dans une seule volonté vous emmèneront à l'appel suivant ci-dessous, ce que vous vouliez voir de toute façon pas l'enveloppe.



8
votes

mettre la console.write (e) dans le bloc de capture. Passez à la version de la libération et appuyez sur CTRL + F5. Vous verrez ceci:

System.NotImplementedException: The method or operation is not implemented.
   at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9
   at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 


0 commentaires

0
votes

Si votre méthode n'est pas assez simple pour être inlinée automatiquement, vous pouvez donner au compilateur un indice fort que vous voulez que ce soit avec le [méthodimploption.aggressiveInlining)] attribut. < / p>

Vous devez toujours compiler en mode de sortie.


0 commentaires