对于 C++ 调试应用程序,我希望能够轻松计算调用堆栈帧的数量。是否有操作系统功能可以做到这一点?
我需要这个用于 Windows 和 Posix,即跨平台。一个或两个平台的解决方案都会很棒。
我可以遍历堆栈以找到所有帧,但我想知道是否有一个简单的调用来执行此操作。
不,因为这是编译器的事情。
编译器可以自由定义自己的 ABI。这定义了如何定义调用堆栈(如果有)。除非您使用纯“C”,否则这并非易事,并且对于每个编译器都会有所不同。
此外,我听说(但尚未验证)MS 正在使用一种新方案,即堆栈帧随机放置在内存周围,以防止(更难)影响返回跳转的缓冲区溢出攻击。不完全相关,但一个有趣的事实。
如果您使用 glibc (Linux),您可以使用以下函数来获取堆栈跟踪:
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
有关更多信息,请参阅回溯的手册页。