首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dbghelp!StackWalk64遍历混合模式(managed+native)堆栈?

如何使用dbghelp!StackWalk64遍历混合模式(managed+native)堆栈?
EN

Stack Overflow用户
提问于 2011-04-13 18:19:53
回答 1查看 1.1K关注 0票数 3

我试图使用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中调用回调,但是它变得非常粗略,而且实际上也不起作用。

EN

回答 1

Stack Overflow用户

发布于 2011-04-13 18:56:48

SOS调试器扩展有帮助吗?它提供了从windbgVisual Studio按照您希望的方式遍历堆栈的能力。

另外,Profiler在.NET Framework2.0中行走:基础和超越也可能有一些用处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5653719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档