如何获得stacktrace中的参数值

我可以通过StackTrace获取有关参数的信息,使用类似的方法:

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

我想知道我如何获得参数的值。 例:

如果我在堆栈跟踪中的方法是这样的:

 void MyMethod(object value) 

电话就像:

 MyMethod(10); 

我想得到价值10.我怎么做?

有两种方法。 function更强大的是用于.NET调试的COM API。 例如,调用堆栈中函数的参数和局部变量都可以从ICorDebugILFrame访问。 但这必须从作为调试器附加到您的进程的单独进程运行。

对于进程内自省,有Profiler API,它也可以找到有关函数参数的信息 。 查看有关“影子堆栈”的信息。

除非您正在创建高度CLR(补丁)版本的解决方案,否则不使用C#。 但是,将Windbg附加到您的进程,将sos.dll切换到您的线程并键入是什么工作

 !ClrStack -p 

显示大多数方法的托管调用堆栈和方法参数。 这甚至在调试器下也不是万无一失的,因为由于内联和JIT优化,堆栈布局非常灵活。 除此之外,一些参数甚至可能不会出现在堆栈内存中,因为它们是通过寄存器传递的(这在x64平台下更为常见)。

回答你的第一个问题。 不,你尝试的方法是不可能的。 工作解决方案是可能的,但根本不可移植。 托管调试器可以部分检索您的参数,但没有100%可用的解决方案(即使在调试器下)。