我可以通过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。 我是怎么做到的?
答案 0 :(得分:9)
有两种方法。更强大的是用于.NET调试的COM API。例如,调用堆栈中函数的参数和局部变量都可以从ICorDebugILFrame访问。但这必须从作为调试器附加到您的进程的单独进程运行。
对于进程内省,有Profiler API, which also can find information about function arguments。查看有关“影子堆栈”的信息。
答案 1 :(得分:3)
除非您正在创建高度CLR(补丁)版本的解决方案,否则不使用C#。但是,将Windbg附加到您的进程,将sos.dll切换到您的线程并键入
是有效的!ClrStack -p
显示大多数方法的托管调用堆栈和方法参数。这甚至在调试器下也不是万无一失的,因为由于内联和JIT优化,堆栈布局非常灵活。除此之外,一些参数甚至可能不会出现在堆栈内存中,因为它们是通过寄存器传递的(在x64平台下更常见)。
回答你的第一个问题。不,你尝试的方法是不可能的。工作解决方案是可能的,但根本不可移植。托管调试器可以部分检索您的参数,但没有100%可用的解决方案(即使在调试器下)。