gpt4 book ai didi

c++ - 您如何使用 dbghelp!StackWalk64 遍历混合模式(托管+ native )堆栈?

转载 作者:太空狗 更新时间:2023-10-29 23:19:57 27 4
gpt4 key购买 nike

我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和 native 帧的调用堆栈。在第一个或第二个托管框架之前一切正常,之后 StackWalk64 无法找出框架的返回地址并失败。

我将 SymFunctionTableAccess64 用于函数表访问回调,并且已使用 SymInitialize() 初始化符号处理程序。我需要在 dbghelp 中施展魔法才能使其正确遍历托管框架吗?

失败的调用堆栈示例:

UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart

注意:这个问题不是关于如何将托管框架解析为符号/方法名称等,我只是想遍历整个堆栈而不考虑符号解析等。

此外,IDebugControl4::GetContextStackTrace 工作正常,但 DbgEng 使用自定义函数表回调,而不是简单地委托(delegate)给 SymFunctionTableAccess64。我怀疑问题是 CLR 使用 RtlInstallFunctionTableCallback 安装回调函数表(指向 mscordacwks),而 SymFunctionTableAccess64 不够聪明,无法遵循它。

我花了一些时间尝试编写一个自定义函数表访问回调来遍历函数表链并在 mscordacwks 中调用回调,但它变得非常粗略并且无论如何都没有真正起作用。

最佳答案

SOS debugger extension有帮助吗?它提供了从 windbgVisual Studio 中完全按照您希望的方式遍历堆栈的能力。

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

关于c++ - 您如何使用 dbghelp!StackWalk64 遍历混合模式(托管+ native )堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5653719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com