如何在 C 中调试 gdb 中的 St9bad_alloc 故障?
Posted
技术标签:
【中文标题】如何在 C 中调试 gdb 中的 St9bad_alloc 故障?【英文标题】:How can I debug St9bad_alloc failures in gdb in C? 【发布时间】:2009-11-02 09:54:58 【问题描述】:我有一个程序失败:
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc
我想这与malloc
/free
有关,但我不知道是哪一个。
我可以在 gdb 中设置哪些断点来中断错误,以便我可以查看堆栈跟踪?
程序是C和C++的结合,用gcc 3.4.2编译。
【问题讨论】:
【参考方案1】:导致异常的并不是真正的 malloc/free,它是“新的”,它肯定在您的应用程序的 C++ 部分中。看起来您提供的参数对于“新”而言太大而无法分配。
'std::bad_alloc' 是由以下代码引起的,例如:
int * p = new int[50000000];
当您将故障转储加载到 gdb 时,回溯会显示什么? 如果无法生成转储,可以要求 GDB 停止when exception is thrown or caught。 不幸的是,某些版本的 GDB 仅支持以下语法:
catch throw
它允许您在抛出任何异常时中断应用程序。 但是,在帮助您看到它应该可以运行
catch throw std::bad_alloc
在较新的版本中。
别忘了:
(gdb) 帮助捕获
是获取其他有用信息的好来源。
【讨论】:
您的“当异常被抛出或捕获时”的链接是 404。【参考方案2】:这很可能是由于某些内存被覆盖,从而破坏了内存分配系统的状态(通常在内存块返回应用程序之前或之后保留)。
如果您有可能(例如,您使用的是 x86 Linux),请在 Valgrind 中运行您的程序,它通常可以准确地显示损坏发生的位置。
【讨论】:
【参考方案3】:我在尝试读取不存在的文件时遇到了这种情况...我会尝试为文件内容创建一个内部缓冲区,但由于该文件不存在,我创建了缓冲区搞砸了。
int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!
记住孩子们,总是初始化你的变量 :D 并检查零案例。
【讨论】:
以上是关于如何在 C 中调试 gdb 中的 St9bad_alloc 故障?的主要内容,如果未能解决你的问题,请参考以下文章
使用GNU/gdb调试Linux C/C++可执行程序查看出错源代码、设置断点