如何在visualc++中快速检测导致堆栈溢出的函数
How to detect the one function causing a stack overflow quickly in Visual C++?
我有一个巨大的c++代码库。在某个数据集上存在堆栈溢出。如果我在Visual Studio调试器下运行程序,我会得到一个调用堆栈30个不熟悉的函数深度-其中一个(或多个)函数在堆栈上创建了一个太大的对象,这导致堆栈耗尽。我看了所有的函数,没有什么明显的——没有像
这样的char buffer[512 * 1024];
我想我可以在每个函数的开头添加一个变量,并转储该变量地址,然后重新编译,然后查看相邻函数之间的差异,但这是大量的体力劳动。
如何快速识别在堆栈上创建了太大的对象集并导致缓冲区溢出的函数?
您可以在Visual c++中使用代码分析,它在更高版本中可用。如果函数使用的堆栈高于某个限制,则生成警告(C6262)。您可以使用/analyze:stacksize
开关,其中stacksize
是您想要的限制。
如果您有堆栈跟踪(并且您应该能够获得堆栈跟踪),您可能能够访问帧的地址。
引起问题的一个函数应该导致帧指针的巨大飞跃。
如果没有,检查堆栈大小,可能只是太小了。
EDIT:如何调试vc++中不明显的问题?(哼…Unix上的代码:/)
Elan Rusking在2011年的GDC演讲中做了一个关于调查的精彩演讲。
堆栈指针(在x86上)存储在ESP
寄存器中。如果您查看一下反汇编并检查ESP
的更改,那么您应该能够看到哪个函数使用较大的值对其进行了递增/递减操作。
维基百科上的例子:
mov eax, DWORD PTR SS:[esp]
add esp, 4
这个add esp
就是你想要跟踪的。除非您使用vla,否则添加/减去的值是硬编码的,因此很容易检查。
线程超过其堆栈分配将引发异常。这个异常可以被microsoftvisualc++中的__try
和__except
关键字捕获。你可以把你的函数包装在这个try-except块中,看看它们是否会导致堆栈溢出。
看这里:如何在Visual c++应用程序中捕获堆栈溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险