3

我正在尝试使用 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 中调用回调,但它变得非常粗略并且无论如何都没有真正起作用。

4

1 回答 1

0

SOS 调试器扩展是否有帮助?它提供了完全按照您希望的方式从windbg和遍历堆栈的能力。Visual Studio

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

于 2011-04-13T18:56:48.357 回答