1

对于 C++ 调试应用程序,我希望能够轻松计算调用堆栈帧的数量。是否有操作系统功能可以做到这一点?

我需要这个用于 Windows 和 Posix,即跨平台。一个或两个平台的解决方案都会很棒。

我可以遍历堆栈以找到所有帧,但我想知道是否有一个简单的调用来执行此操作。

4

2 回答 2

2

不,因为这是编译器的事情。

编译器可以自由定义自己的 ABI。这定义了如何定义调用堆栈(如果有)。除非您使用纯“C”,否则这并非易事,并且对于每个编译器都会有所不同。

此外,我听说(但尚未验证)MS 正在使用一种新方案,即堆栈帧随机放置在内存周围,以防止(更难)影响返回跳转的缓冲区溢出攻击。不完全相关,但一个有趣的事实。

于 2009-03-26T17:26:16.297 回答
1

如果您使用 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);

有关更多信息,请参阅回溯的手册页。

于 2009-04-06T21:58:03.953 回答