对于C++调试应用程序,我希望能够轻松地计算调用栈帧的数量。有没有操作系统功能可以做到这一点?
我需要这为Windows和Posix,即跨平台。任何一个或两个平台的解决方案都是很好的。
我可以遍历堆栈来找到所有的帧,但我想知道是否有一个简单的调用来做到这一点。
发布于 2009-03-26 17:26:16
不,因为这是一个编译器的事情。
编译器可以自由地定义自己的ABI。这定义了如何定义callstack (如果有的话)。除非您使用的是纯"C“,否则这不是微不足道的,并且对于每个编译器都是不同的。
我还听说(但没有证实) MS正在使用一种新的方案,其中堆栈帧被随机放置在内存周围,以防止(使之更难)影响返回跳转的缓冲区溢出攻击。这并不完全相关,但却是一个有趣的事实。
发布于 2009-04-06 21:58:04
如果您使用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);有关更多信息,请参阅backtrace的手册页。
https://stackoverflow.com/questions/686419
复制相似问题