【问题标题】:Segmentation Fault with Large Input大输入的分段错误
【发布时间】:2011-09-22 16:28:17
【问题描述】:

我知道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

【问题讨论】:

  • 你应该从发布相关代码开始。
  • 可能是程序中的硬编码约束。
  • 是的,我可以显示代码……但是代码太复杂了……无论如何我都可以显示
  • 您应该真正提及您正在使用的操作系统以及它是 32 位还是 64 位。
  • const float inf=10000000000; 完全错误;浮点数有一个代表无穷大的值。后来将其转换为 int 更加错误。你应该使用 MAX_INT 或类似的。

标签: c++ segmentation-fault


【解决方案1】:

您的代码多次调用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)

看看会发生什么。

【讨论】:

  • thx...但是我该如何改变呢?我在代码中搜索“malloc”,然后找到说“clusterIdElNew = (clusterIdEl *) malloc(sizeof(clusterIdEl));”...那我该如何更改?
  • 嗯...我已经添加了一个宏,应该可以自动执行此操作。只需在文件顶部的 #include 行之后添加前面的代码即可。
  • 我在#include 之后将它添加到顶部,....但仍然无法正常工作...但还是谢谢
【解决方案2】:

即使我要求 30GB 内存

30GB 的内存吗?我真的对此表示怀疑。

答案取决于程序的功能。如果程序在没有内存的情况下读取和处理数据(即之前读取的数据不影响正在读取的数据的处理),则可以分块加载文件。

但没有细节,我不能多说。


调试您的程序。编译时开启调试:

g++ -g -o program -Wall program.cpp 

并使用gdb对其进行调试:

gdb program
(gdb) run

并且应该显示导致段错误的行号和函数。

【讨论】:

  • 是的,我可以。我正在使用一种 hpcc 系统。我可以申请那些 48GB 内存的机器。
  • 我没说你,我说你可能不;)
【解决方案3】:

他们很可能在那里有一个固定大小的缓冲区,而您的“大输入”太大而无法放入其中。默认情况下,C++ 不检查这些东西(如果他们使用了来自 STL 的经过良好检查的数据结构,但显然他们没有这样做)。

【讨论】:

    【解决方案4】:

    尝试在调试器中运行程序,但首先要确保它已使用调试信息 (-g) 进行编译。使用 segvaults 上的数据运行它。可能是您的程序尝试通过调用 malloc 或 new 来分配大量内存并将其分配给指针,不检查这是否成功,然后尝试访问应该的内存(通过指针)被分配。您可以通过在调试器中的分段违规后检查堆栈跟踪来了解它发生的位置。这应该给你一个线索,应该修改程序的哪一部分,例如它不会在整个输入文件中读取,而只是在循环中读取其中的一部分。

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多