繁体   English   中英

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

[英]How can I debug St9bad_alloc failures in gdb in C?

我有一个程序失败:

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

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

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

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

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

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

 int * p = new int[50000000];

将崩溃转储加载到gdb时,backtrace会说什么? 如果无法生成转储,则可以在抛出或捕获异常时让GDB停止。 不幸的是,某些版本的GDB仅支持以下语法:

catch throw

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

catch throw std::bad_alloc

在较新的版本中。

不要忘记:

(gdb)帮忙抓住

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM