如何在C中调试gdb中的St9bad_alloc故障?

时间:2009-11-02 09:54:59

标签: c++ c debugging gdb bad-alloc

我的程序失败了:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc

我想这与malloc / free有关,但我不知道是哪一个。

我可以在gdb中设置什么断点来破坏错误,以便我可以查看堆栈跟踪?

该程序是C和C ++的组合,使用gcc 3.4.2编译。

3 个答案:

答案 0 :(得分:13)

它不是真正的malloc / free导致异常,它是“new”,它绝对是你应用程序的C ++部分。看起来您提供的参数太大而无法分配“新”。

'std :: bad_alloc'由以下代码引起,例如:

 int * p = new int[50000000];

将崩溃转储加载到gdb时,backtrace会说什么? 如果您无法生成转储,则可以要求GDB停止when exception is thrown or caught。 不幸的是,某些版本的GDB仅支持以下语法:

catch throw

允许您在抛出任何异常时中断应用程序。 但是,在帮助中,您可以看到应该可以运行

catch throw std::bad_alloc

在较新的版本中。

不要忘记:

  

(gdb)帮助抓住

是其他有用信息的良好来源。

答案 1 :(得分:0)

很可能由于某些内存被覆盖而发生这种情况,从而破坏了内存分配系统的状态(通常在内存块返回应用程序之前或之后保存)。

如果您有可能(即,您使用的是x86 Linux),请在Valgrind中运行您的程序,它通常可以准确显示损坏发生的位置。

答案 2 :(得分:0)

我尝试读取一个不存在的文件时已经有了这个...我会尝试为文件内容创建一个内部缓冲区,但由于该文件不存在,我创建了缓冲区搞砸了。

int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!

记住孩子,总是初始化你的变量:D并检查零个案例。