我试图使用x64在StackWalk64进程上遍历一个包含托管帧和本机帧的调用堆栈。在第一个或第二个托管帧之前,一切都正常工作,之后StackWalk64无法计算出该帧的返回地址并失败。
我使用SymFunctionTableAccess64进行函数表访问回调,符号处理程序已经用SymInitialize()初始化。我需要在dbghelp中使用一些魔法才能让它正确地遍历托管帧吗?
失败的示例调用堆栈:
UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart
注意:这个问题不是关于如何将托管帧解析为符号/方法名称/等等的问题,我只是想在不考虑符号解析/等的情况下遍历整个堆栈。
另外,IDebugControl4 4::GetContextStackTrace工作正常,但是DbgEng使用一个自定义函数表回调,而不是简单地委托给SymFunctionTableAccess64。我怀疑问题在于CLR使用RtlInstallFunctionTableCallback来安装回调函数表(该表指向m斯科dacwks),而SymFunctionTableAccess64没有足够的智能来跟踪它。
我花了一些时间试图编写一个自定义的函数表访问回调,以遍历函数表链,并在mscordacwks中调用回调,但是它变得非常粗略,而且实际上也不起作用。
发布于 2011-04-13 18:56:48
SOS调试器扩展有帮助吗?它提供了从windbg和Visual Studio按照您希望的方式遍历堆栈的能力。
另外,Profiler在.NET Framework2.0中行走:基础和超越也可能有一些用处。
https://stackoverflow.com/questions/5653719
复制相似问题