我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和本机帧的调用堆栈。一切工作正常,直到第一个或第二个托管帧,之后 StackWalk64 无法计算出该帧的返回地址并失败。
我使用 SymFunctionTableAccess64 进行函数表访问回调,并且符号处理程序已使用 SymInitialize() 进行初始化。我需要在 dbghelp 中做一些魔法才能让它正确地遍历托管帧吗?
失败的调用堆栈示例:
UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart
注:本题IS NOT关于如何将托管帧解析为符号/方法名称/等,我只想遍历整个堆栈,而不考虑符号解析/等。
此外,IDebugControl4::GetContextStackTrace 工作正常,但 DbgEng 使用自定义函数表回调,而不是简单地委托给 SymFunctionTableAccess64。我怀疑问题在于 CLR 使用 RtlInstallFunctionTableCallback 来安装回调函数表(指向 mscordacwks),而 SymFunctionTableAccess64 不够智能,无法遵循这一点。
我花了一些时间尝试编写一个自定义函数表访问回调来遍历函数表链并在 mscordacwks 中调用回调,但它变得非常粗略并且实际上并没有起作用。
是否SOS 调试器扩展 http://msdn.microsoft.com/en-us/library/bb190764.aspx有帮助吗?它提供了能力,从windbg
and Visual Studio
完全按照您希望的方式遍历堆栈。
或者.NET Framework 2.0 中的 Profiler 堆栈行走:基础知识及其他知识 http://msdn.microsoft.com/en-us/library/bb264782.aspx可能有一些用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)