对于C ++调试应用程序,我希望能够轻松计算callstack帧的数量。是否有OS功能来执行此操作?
我需要这个用于Windows和Posix,即跨平台。任何一个或两个平台的解决方案都很棒。
我可以走堆栈找到所有的帧,但我想知道是否有一个简单的调用来做到这一点。
答案 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);
有关更多信息,请参阅回溯的手册页。