作为参考,我回顾了以下问题: C# reusable function to dump current value of local variables, Find size of object instance in bytes in c#
然而,这个问题在这个问题上有所不同。每this answer,局部变量存储在堆栈中(至少对于值类型)。
我的目标:可以在任何其他方法中调用的可重用方法,并自动生成仅包含该方法的局部变量的内存转储。我不一定要寻找能够立即返回对象的东西 - 内存中的原始字节数组很好。
如果可能的话,我不想要一个完整的流程转储。
我一直在努力:
我最初的想法是我可以尝试获取对象内存地址。据我所知,托管对象的地址可以通过以下方式获得:
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个项目或获取最近添加的内存地址?
如果没有,是否有更好的方法来实现这一目标?
注意:我刚发现SOS.DLL。这会有帮助吗?