Comment obtenir la valeur des parameters dans stacktrace

Je peux obtenir des informations sur un paramètre avec StackTrace en utilisant quelque chose comme:

catch (Exception ex) { var st = new StackTrace(ex); System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First(); } 

Je veux savoir comment je reçois la valeur de paramètre. Exemple:

Si ma méthode dans la trace de stack était comme:

 void MyMethod(object value) 

Et l’appel était comme:

 MyMethod(10); 

Je veux obtenir la valeur 10. Comment je fais ça?

Il y a deux façons. Le plus puissant est l’API COM pour le débogage .NET. Par exemple, les arguments et les variables locales de fonction dans la stack d’appels sont tous deux accessibles à partir de ICorDebugILFrame . Mais cela doit être exécuté à partir d’un processus distinct attaché à votre processus en tant que débogueur.

Pour l’introspection en cours de processus, il existe l’ API Profiler, qui peut également trouver des informations sur les arguments de la fonction . Regardez les informations sur les “stacks d’ombre”.

Pas avec C # sauf si vous créez une solution fortement dépendante de la version CLR (correctif). Mais ce qui fonctionne, c’est d’attacher Windbg à votre processus, de charger le commutateur sos.dll dans votre thread et de taper

 !ClrStack -p 

pour afficher la stack d’appels gérés et les parameters de méthode pour la plupart des méthodes. Cela n’est même pas infaillible sous le débogueur car, en raison de l’optimisation en ligne et de l’optimisation JIT, la disposition de la stack est très flexible. En outre, certains parameters peuvent même ne pas apparaître dans la mémoire de la stack car ils sont transmis via des registres (ce qui est encore plus courant sous la plate-forme x64).

Pour répondre à votre première question. Non, ce n’est pas possible avec l’approche que vous essayez. Une solution de travail serait possible mais pas du tout portable. Un débogueur géré peut partiellement récupérer vos arguments, mais il n’existe pas de solution opérationnelle à 100% (même sous le débogueur).