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