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

11

我有一个程序失败了,错误信息是:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
我认为这与malloc/free有关,但我不知道是哪一个。
在gdb上可以设置什么断点来中断错误,以便我可以查看堆栈跟踪?
该程序是使用gcc 3.4.2编译的C和C ++组合。
3个回答

15

这个异常并不是由malloc/free引起的,而是由于你的应用程序中C++部分的"new"导致的。看起来你提供了一个太大的参数给"new"进行分配。

'std::bad_alloc' 可能由以下代码引起:

 int * p = new int[50000000];

当您将崩溃转储加载到gdb中时,回溯(backtrace)会显示什么? 如果无法生成转储(dump),您可以要求GDB在抛出或捕获异常时停止(when exception is thrown or caught)。 不幸的是,一些版本的GDB仅支持以下语法:
catch throw

该功能允许您在抛出任何异常时中断应用程序。 然而,在帮助文档中,您可以看到应该可以运行。

catch throw std::bad_alloc

在更新的版本中。

不要忘记:

(gdb) help catch

是获取其他有用信息的好方法。


您提供的“当异常被抛出或捕获时”的链接是404。 - Karl

1

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

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


0

在尝试读取不存在的文件时,我遇到了这个问题……我会尝试为文件内容创建一个内部缓冲区,但由于文件不存在,我的缓冲区创建出了问题。

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

记住,孩子们,始终要初始化你的变量并检查零情况 :D。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接