【问题标题】:How do you walk a mixed-mode (managed+native) stack with dbghelp!StackWalk64?如何使用 dbghelp!StackWalk64 遍历混合模式(托管+本机)堆栈?
【发布时间】:2011-08-04 22:52:55
【问题描述】:

我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和本机帧的调用堆栈。一切正常,直到第一个或第二个托管帧,之后 StackWalk64 无法确定帧的返回地址并失败。

我将 SymFunctionTableAccess64 用于函数表访问回调,并且符号处理程序已使用 SymInitialize() 进行了初始化。我需要在 dbghelp 中做些什么来让它正确地遍历托管帧吗?

失败的调用栈示例:

UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart

注意:这个问题不是关于如何将托管帧解析为符号/方法名称/等,我只是想在不考虑符号解析/等的情况下遍历整个堆栈。

此外,IDebugControl4::GetContextStackTrace 工作正常,但 DbgEng 使用自定义函数表回调,而不是简单地委托给 SymFunctionTableAccess64。我怀疑问题在于 CLR 使用 RtlInstallFunctionTableCallback 来安装回调函数表(指向 mscordacwks),而 SymFunctionTableAccess64 不够聪明,无法遵循这一点。

我花了一些时间尝试编写一个自定义函数表访问回调来遍历函数表链并在 mscordacwks 中调用回调,但它变得非常粗略并且无论如何都没有真正工作。

【问题讨论】:

  • 编写堆栈遍历机制的 VS Profiler 开发人员对此拥有专利。这是不平凡的。
  • 你有那个来源吗?

标签: c++ 64-bit stack-trace dbghelp


【解决方案1】:

SOS debugger extension 有帮助吗?它提供了windbgVisual Studio 以您希望的方式遍历堆栈的能力。

或者Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyond 可能会有一些用处。

【讨论】:

  • 我需要以编程方式执行此操作,而不是来自 windbg。 CLR 分析 API 可以工作,但它依赖于实时进程。我的目标是尽可能减少我的解决方案的占用空间,这就是我不想依赖 DbgEng 来获取堆栈跟踪的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2016-08-13
  • 2014-06-05
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多