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

时间:2016-10-20 16:39:47

标签: c# memory stack

作为参考,我回顾了以下问题: C# reusable function to dump current value of local variablesFind 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。这会有帮助吗?

0 个答案:

没有答案