如何在 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++可执行程序查看出错源代码、设置断点

ubuntu 写c/c++如何调试?

linux 下面怎么用gdb调试多个.c文件?

在vscode中使用gdb调试

使用 Netbeans/gdb 调试 C 会立即以 SIGSEGV 终止?

代码调试篇:如何编写 gdb 自定义命令