【问题标题】:Navigate from stackframe to stackframe in the Managed stack inside CDB/WinDbg在 CDB/WinDbg 内的托管堆栈中从堆栈帧导航到堆栈帧
【发布时间】:2016-01-12 20:17:26
【问题描述】:

我收到了十几个转储文件。使用 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。我也想知道这个堆栈帧中的函数参数值/引用。

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

【问题讨论】:

    标签: clr windbg sosex


    【解决方案1】:

    Steve Johnson 的 SOSEX!mframe 命令。

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

    您从!mk 获得帧号。如果您启用了 DML,则可以单击帧号并自动执行 !mframe 命令。之后,您可以使用!mdv 来显示参数和局部变量。

    另外,!mdv <frame> 也直接采用帧号。

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

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 1970-01-01
      • 2015-11-07
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2011-07-02
      相关资源
      最近更新 更多