如何计算callstack帧的数量?

时间:2009-03-26 16:06:38

标签: c++ callstack

对于C ++调试应用程序,我希望能够轻松计算callstack帧的数量。是否有OS功能来执行此操作?

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

我可以走堆栈找到所有的帧,但我想知道是否有一个简单的调用来做到这一点。

2 个答案:

答案 0 :(得分:2)

不,因为这是一个编译器。

编译器可以自由定义自己的ABI。这定义了如何定义callstack(如果有的话)。除非你使用纯粹的“C”,否则这对于每个编译器来说都是不同的。

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

答案 1 :(得分:0)

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

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