Question

Je voudrais pouvoir obtenir toutes les valeurs de paramètre du cadre de pile dans .NET. Un peu comme vous pouvez voir les valeurs dans la pile d'appels dans le débogueur Visual Studio. Mon approche s'est concentrée sur l'utilisation du Classe StackFrame , puis une réflexion sur une ParameterInfo . J'ai eu du succès avec la réflexion et les propriétés, mais cela s'avère un peu plus compliqué.

Existe-t-il une approche pour y parvenir?

Le code à ce jour ressemble à ceci:

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Go(1);
    }
}

public class A
{
    internal void Go(int x)
    {
        B b = new B();
        b.Go(4);
    }
}

public class B
{
    internal void Go(int y)
    {
        Console.WriteLine(GetStackTrace());

    }
    public static string GetStackTrace()
    {
        StringBuilder sb = new StringBuilder();
        StackTrace st = new StackTrace(true);
        StackFrame[] frames = st.GetFrames();

        foreach (StackFrame frame in frames)
        {
            MethodBase method = frame.GetMethod();

            sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name);
            ParameterInfo[] paramaters = method.GetParameters();
            foreach (ParameterInfo paramater in paramaters)
            {
                sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString());
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

La sortie ressemble à ceci:

SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args

J'aimerais qu'il ressemble plus à ceci:

SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main

Juste un peu de contexte, mon plan était d’essayer de l’utiliser lorsque je lance mes propres exceptions. Je regarderai vos suggestions plus en détail et verrai si je peux le voir convenir.

Était-ce utile?

La solution

Il semble que cela ne puisse pas être fait de cette façon. Il fournira uniquement des méta-informations sur la méthode et ses paramètres. Pas la valeur réelle au moment du callstack.

Certains suggèrent de dériver vos classes à partir de ContextBoundObject et de les utiliser. IMessageSink à notifier à tous appels de méthode et les valeurs des paramètres. Ceci est normalement utilisé pour .NET Remoting .

Une autre suggestion pourrait être d'écrire un débogueur. C'est ainsi que l'EDI obtient ses informations. Microsoft a des Mdbg dont vous pouvez obtenir le code source. code. Ou écrivez un profileur de CLR .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top