【问题标题】:.Net - what is an "unwind"?.Net - 什么是“放松”?
【发布时间】:2010-01-05 11:16:18
【问题描述】:
在回答 this 问题时,我注意到在处理异常时尝试移动“光标”时出现以下对话框:
无法将下一条语句设置到此位置。尝试展开调用堆栈失败。
在以下情况下无法展开:
- 调试是通过即时调试启动的。
- 正在放松
- 已引发 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。
究竟什么是放松?
【问题讨论】:
标签:
c#
.net
vb.net
stack-unwinding
【解决方案1】:
是我!
不,在这种情况下,它通常是指在堆栈中步进(“向后”/“向上”)的过程,删除连续的帧,直到您回到所需的级别。典型的堆栈(当然)在它们的结构中是非常线性的,帧是首尾相连的,所以实际上并没有太多的字面展开,但这就是所谓的。
This Wikipedia page 有更多细节。
【解决方案3】:
这里 CLR 正在“展开”堆栈,以便找到具有可以处理异常的 catch 块的方法,即,如果当前方法不处理异常,则返回到调用它的方法以查看如果会的话。重复此过程,直到找到处理异常的方法或达到应用程序级错误处理为止。
【解决方案4】:
这意味着有一个错误的线程或者可能是因为堆栈已满并且没有创建堆栈帧,CLR 在这种情况下选择 UNWIND 当前上下文。