簡體   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