Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 492
cloudraven Avatar asked Feb 27 '11 21:02

cloudraven


1 Answers

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.
like image 157
Alexei Levenkov Avatar answered Oct 18 '22 15:10

Alexei Levenkov