[英]Segmentation Fault with Large Input
我知道segmentation fault
意味着该进程试图访问不允许的某些内存。
我正在运行一些使用C ++编写的程序。 当我的输入很大(大约1GB)时,即使我要求30GB内存,也会出现分段错误; 而当输入尺寸非常小时,它会很顺利。
那我该怎么办? 是因为内存不足吗? 我真的是一个没有太多C ++知识的新手。 我甚至不知道代码的哪一部分控制内存分配。
感谢BLender,来自调试的行是:
Program received signal SIGSEGV, Segmentation fault. 0x0000003fbd653174 in _IO_vfscanf_internal () from /share/bin/intel/cc/10.1.015/lib/tls/x86_64/libc.so.6
甚至我要求30GB内存
你有 30GB的内存吗? 我真的很怀疑。
答案取决于程序的功能。 如果程序在没有内存的情况下读取和处理数据(即,之前读取的数据不会影响正在读取的数据的处理),则可以以块的形式加载文件。
但没有细节,我不能说更多。
调试你的程序。 编译时,启用调试:
g++ -g -o program -Wall program.cpp
并使用gdb
来调试它:
gdb program
(gdb) run
并且应该显示导致段错误的行号和功能。
你的代码多次调用malloc
,但从不free
,所以它使用了相当多的内存。 它永远不会检查内存不足的情况......
我的建议是你将所有对malloc的调用改为:
size_t total_memory = 0;
void *my_malloc(size_t sz)
{
void *res = malloc(sz);
total_memory += sz;
if (res == NULL)
{
printf("Too much memory eaten: %zu\n", total_memory);
abort();
}
return res;
}
#define malloc(x) my_malloc(x)
看看会发生什么。
很可能他们在那里有一个固定大小的缓冲区,而你的“大输入”太大而不适合它。 默认情况下,C ++不会检查这些内容(如果他们使用了STL中的精确检查数据结构,但很明显他们没有这样做)。
尝试在调试器中运行程序,但首先确保使用调试信息(-g)编译它。 使用segvaults的数据运行它。 可能是你的程序尝试通过调用malloc或new来分配大量内存并将其分配给指针,不检查是否成功然后尝试访问内存(通过指针)分配。 通过在调试器中分段违例后检查堆栈跟踪,您可以看到它发生的位置。 这应该可以告诉你应该修改程序的哪一部分,例如它不会在整个输入文件中读取,而只是在循环中读取它的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.