从堆栈框架导航到CDB / WinDbg内托管堆栈中的堆栈框架

时间:2015-10-14 16:14:45

标签: clr windbg sosex

我收到了十几个转储文件。使用windbg / sosex命令!dumpstack -EE,其中很多都是在最后显示这些行:

0aa6ce7c 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String))
0aa6cecc 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String))
0aa6cf54 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String))
0aa6d080 6f42bc51 (MethodDesc 6f1da670 +0x81 System.TimeSpan.TimeToTicks(Int32, Int32, Int32))
0aa6d0a8 6f42c0a0 (MethodDesc 6f1daf1c +0x40 System.DateTime.TimeToTicks(Int32, Int32, Int32))
0aa6d0d0 6f42cb8f (MethodDesc 6f1da8ec +0x7f System.DateTime.Add(Double, Int32))

不幸的是,尝试使用!clrstack -a获取局部变量并不能给我带来明智的结果:

0:045> !clrstack -a
OS Thread Id: 0xf50 (45)
Child SP       IP Call Site
0aa6ed78 76df7094 [GCFrame: 0aa6ed78]
0aa6ef5c 76df7094 [DebuggerU2MCatchHandlerFrame: 0aa6ef5c]

有没有办法移动到另一帧而不是最后一帧? (以便在这个框架中获得当地人)。

在纯模式下,我可以这样做:

.frame @$.frame +1

然后我可以在

的前一帧中使用本地人
dv

我想知道如何对托管堆栈做同样的事情,因为我可以在之前的帧中执行!clrstack -a。我也想知道这个堆栈框架中的函数参数值/引用。

是否有命令执行此类操作?

1 个答案:

答案 0 :(得分:3)

史蒂夫约翰逊的SOSEX拥有!mframe命令。

虽然您已经标记了问题,但您没有使用任何SOSEX命令,只使用了SOS命令,这可能是您找不到命令的原因。

您可以从!mk获取帧编号。如果启用了DML,则可以单击帧编号并自动执行!mframe命令。之后,您可以!mdv显示参数和本地人。

或者,!mdv <frame>也可以直接使用帧编号。

但是,我不确定这总是有帮助的。 SOSEX不能做魔术,需要依赖.NET框架提供的信息。如果由于某种原因打破了,你可能会不走运。