我正在尝试使用StackWalk64在x64进程上遍历包含托管和本机帧的callstack。一切正常,直到第一个或第二个托管框架,之后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中调用回调,但它非常粗略,并且无论如何都没有真正起作用。
答案 0 :(得分:0)
SOS debugger extension有帮助吗?它提供了从windbg
和Visual Studio
完全按照您希望的方式遍历堆栈的能力。
或者Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyond可能有用。