繁体   English   中英

大输入分段故障

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

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