C#:转储内存/捕获局部变量的值

C#:转储内存/捕获局部变量的值,c#,memory,stack,C#,Memory,Stack,为了便于参考,我复习了以下问题: , 然而,这个问题在这个问题上有点不同。根据,局部变量存储在堆栈上(至少对于值类型) 我的目标:一个可重用的方法,可以在任何其他方法中调用,并自动生成该方法的局部变量的内存转储。我不一定要寻找能够立即返回对象的东西——从内存中创建一个原始字节数组就可以了 如果可能的话,我不想要一个完整的进程转储 我一直在尝试的: 我最初的想法是,我可以尝试获取对象内存地址。我理解,托管对象的地址可以通过以下方式获得: TypedReference tr = __makere

为了便于参考,我复习了以下问题: ,

然而,这个问题在这个问题上有点不同。根据,局部变量存储在堆栈上(至少对于值类型)

我的目标:一个可重用的方法,可以在任何其他方法中调用,并自动生成该方法的局部变量的内存转储。我不一定要寻找能够立即返回对象的东西——从内存中创建一个原始字节数组就可以了

如果可能的话,我不想要一个完整的进程转储

我一直在尝试的:

我最初的想法是,我可以尝试获取对象内存地址。我理解,托管对象的地址可以通过以下方式获得:

TypedReference tr = __makeref(obj);
return **(IntPtr**)(&tr);
但是,如果不为每个变量手动调用它,我无法弄清楚如何实际获取局部变量的地址

然后我考虑使用堆栈和方法信息来确定需要多少局部变量以及类型。例如,使用以下代码,我可以获得方法信息:

catch (Exception ex)
    var trace = new System.Diagnostics.StackTrace(ex);
    var frame = trace.GetFrame(0);
    var method = frame.GetMethod();
    var locals = method.GetMethodBody().LocalVariables;
}
但是,我缺乏关于如何从堆栈中获取最新数据的信息。我知道这可能非常复杂,但我有兴趣看看在C#中可以做些什么,而不必求助于外部依赖或第三方工具

考虑到这一点,使用安全或不安全的代码(有文档记录或无文档记录),是否有办法从堆栈中弹出最后n个项或获取最近添加的内存地址?

如果没有,是否有更好的方法来实现这一目标?


注:我刚刚发现。这会有帮助吗?

您正在尝试构建调试器吗?要知道,虽然IL代码使用堆栈,但抖动也可能使用寄存器。我想是的。我愿意接受实现最终目标的最佳方法,即对异常自动转储局部变量。理想情况下,我想要一个与调试和发布版本一起工作的解决方案。堆栈的使用是一个实现细节,规范不保证,因此任何解决方案都将依赖于实现的细节(正如Lasse所指出的,JITer可以很好地将变量移动到寄存器,即使.NET实现将它们放在堆栈上).你可能想研究一下使用@EricJ。如果有帮助的话,这可能只在一个框架版本(4.5)和一个平台(Windows10)上使用。我不确定这会有多大的不同?您是否正在尝试构建调试器?要知道,虽然IL代码使用堆栈,但抖动也可能使用寄存器。我想是的。我愿意接受实现最终目标的最佳方法,即对异常自动转储局部变量。理想情况下,我想要一个与调试和发布版本一起工作的解决方案。堆栈的使用是一个实现细节,规范不保证,因此任何解决方案都将依赖于实现的细节(正如Lasse所指出的,JITer可以很好地将变量移动到寄存器,即使.NET实现将它们放在堆栈上).你可能想研究一下使用@EricJ。如果有帮助的话,这可能只在一个框架版本(4.5)和一个平台(Windows10)上使用。我不确定这会有多大的不同?