[英]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.