我有一个C++工具可以一次遍历调用堆栈。在代码中,它首先获取实时CPU寄存器的拷贝(通过RtlCaptureContext()),然后使用一些“#ifdef...”block将特定于CPU的寄存器名称保存到stackframe.AddrPC.Offset,...AddrStack...,and...AddrFrame...;此外,对于上面的3个Addr...成员中的每一个,它都设置了stackframe.Addr....Mode=AddrModeFlat。(这是从我前一段时间遇到的一些示例代码中借用的。)使用x86二进制文件,效果很好。但是,对于x64二进制文件,StackWalk64
有没有人知道比“StackWalk”更好/更快的获取调用堆栈的方法?我还认为stackwalk在有很多变量的方法上也会变慢......(我想知道商业分析员是做什么的?)我在Windows上使用C++。:)谢谢:) 最佳答案 我不知道它是否更快,而且它不会向您显示任何符号,而且我相信您可以做得更好,但这是我不久前需要此信息时写的一些代码(仅适用于Windows):structCallStackItem{void*pc;CallStackItem*next;CallStackItem(){pc=NULL;next=NULL;}};typ
好的,一天内关于SO的第二个问题。看起来Windows编程让我很开心......:S我目前正在尝试获取Win32可执行文件上的函数调用堆栈。今天早上,我也问了一个关于这个的问题:Win32-BacktracefromCcode现在,我非常确定StackWalk64函数是实现此目的的关键。我已经阅读了一些关于如何使用它的文章,以及MS文档。它实际上在我的测试程序中显示了帧,所以它有点工作......问题是我无法从堆栈信息中检索符号名称。为此,我正在使用SymGetSymFromAddr64函数和UnDecorateSymbolName。但我只得到垃圾字符。这是我的代码。希望它不会困惑,因