Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算调用堆栈帧的数量? < >对于C++调试应用程序,我希望能够轻松地计算调用堆栈帧的数量。是否有操作系统功能来执行此操作_C++_Callstack - Fatal编程技术网

如何计算调用堆栈帧的数量? < >对于C++调试应用程序,我希望能够轻松地计算调用堆栈帧的数量。是否有操作系统功能来执行此操作

如何计算调用堆栈帧的数量? < >对于C++调试应用程序,我希望能够轻松地计算调用堆栈帧的数量。是否有操作系统功能来执行此操作,c++,callstack,C++,Callstack,我需要这个用于Windows和Posix,即跨平台。任何一个或两个平台的解决方案都很好 我可以遍历堆栈来查找所有帧,但我想知道是否有一个简单的调用来执行此操作。否,因为这是一个编译器的事情 编译器可以自由定义自己的ABI。这定义了如何定义调用堆栈(如果有)。除非您使用的是纯“C”,否则这是非常重要的,并且对于每个编译器都是不同的 此外,我还听说(但尚未验证)MS正在使用一种新方案,即在内存周围随机放置堆栈帧,以防止(更难)影响返回跳转的缓冲区溢出攻击。不完全相关,但这是一个有趣的事实。如果您使用

我需要这个用于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);
#包括
int backtrace(void**buffer,int size);
字符**回溯符号(void*const*buffer,int size);
void backtrace_symbols_fd(void*const*buffer,int size,int fd);

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

我上次听说,他们只是在堆栈帧上放置了随机的“cookies”,在覆盖返回地址之前,您必须覆盖这些cookies。然后在函数返回时检查cookie,如果cookie已更改,应用程序将终止。只需指出,Microsoft的堆栈cookie虽然有趣,但已经失败,因此不应依赖于安全。堆栈帧确实不是随机放置的,因为这会破坏整个“堆栈”的功能。我不是指cookies。我指的是框架的实际位置。它可能位于内存中的任何位置(通过编译器的一点额外连接)。堆栈只是记录信息的最简单方法,从技术上讲,它不需要是堆栈。没有调用获取堆栈大小。有没有跨平台的库可以做到这一点?