我知道StackWalk64()
API可以用来在windows中打印调用堆栈。有很多关于如何在SO上工作的讨论。
Function Call Stack in C++
StackWalk64 on Windows - Get symbol name
StackWalker - Walking the callstack
我观察到StackWalk64()
需要符号文件(PDB文件)来显示函数名。如果不存在PDB文件,则不打印符号信息。
我的问题是-
1.我的理解正确吗?我没发现有记录。
1.此API是否出于测试/调试目的而公开?如何让它工作
不存在PDB文件的生产系统?
1.在Linux上,如果符号文件不存在,则会像打印的调用堆栈一样损坏。至少在Windows上可以实现吗?
3条答案
按热度按时间hmmo2u0o1#
如果只是一个堆栈跟踪,CaptureStackBackTrace()应该足够了。
s6fujrry2#
回答你的问题-
是的。你需要符号来打印函数名。不需要私有符号,公共符号也可以(如果你想发布pdb)。
这个API主要用于调试器,但它可以用于许多工具,例如。显示线程堆栈的高级任务管理器(ProcessExplorer)。如果你想要函数名,那么就需要符号(至少是公共符号)。
没有符号你可以实现的是--调用堆栈将用偏移量(从模块的开始)进行模化,例如。xyz.dll+0x62
shyt4zoc3#
是的。PE文件可以嵌入调试符号,但msvc似乎不支持此功能(How to instruct MSVC to embed symbols in the executable?)。分隔.exe文件和.pdb文件的原因是为了更快地链接。
windows上的Mingw会将调试符号直接嵌入到.exe文件中,而不是msvc输出到pdb文件中。
在Linux和macos上,通过elf/mach-o文件的符号表,一些最小的信息可能可用于堆栈跟踪。