Is there a simple way to obtain all the local variables in the current stack frame in C# (or CIL)

落爺英雄遲暮 提交于 2020-01-09 21:17:43

问题


Following my previous question, in which I wanted to dump all the variables in the stack (from the current and all the previous frame) that can be seen here: Is there a way to examine the stack variables at runtime in C#?

I was suggested to intercept the calls manually or use AOP framework like PostSharp to simplify such a task. I looked at PostSharp and the interception arguments don't include the variables in the current stack frame. I wonder if there is a simple way to automatically get all the local variables in the current stack frame. I suppose I can perform code analysis and generate code that copies all those values into a collection, but maybe there is a built-in mechanism that does it.

Thanks in advance for any suggestions.

EDIT: I should have given more detail of why I want to do this. I want to be able to suspend execution in the middle of a method. If I had the contents of the stack I could resume execution later, or even serialize it and continue it in another machine (assuming it is relatively simple code, so no threads or I/O for example). It is ok to run a code analysis tool that would allow me to automatically generate extra code that saves this state. I think I will probably have to analyze the CIL to do this.


回答1:


You should use debugging API and debug your program from another process. Writing your own managed debugger is not trivial, but at least supported way of achieving your stated goal.

To my knowledge there is nothing in managed .Net framwork that you can use to collect information about run-time state of local variables of a method.

Note that there are enough cases when values for local variables do not exist to make writing general code to handle them complex:

  • method can be inlined (local variables will be merged with calling methods)
  • local variables can be optimized out
  • local variable can get out of scope and be garbage collected befor end of method.



回答2:


   System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
        System.Diagnostics.StackFrame frame = trace.GetFrame(0);
        MethodBase method = frame.GetMethod();
        MethodBody methodBody = method.GetMethodBody();
        if (methodBody != null)
        {
            foreach (var local in methodBody.LocalVariables)
            {
                Console.WriteLine(local);
            }
        }
        Console.ReadKey();



回答3:


Consider to Write minidumps using a custom PostSharp aspect (with IL transformation).

A shared debuging engine library, written in C#. is available on NuGet as Microsoft.Samples.Debugging.MdbgEngine.

The code is available on GitHub as part of the PADRE ( Pluggable Automatic Debugging and Reporting Engine)repository



来源:https://stackoverflow.com/questions/5135939/is-there-a-simple-way-to-obtain-all-the-local-variables-in-the-current-stack-fra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!