2012-11-07 47 views
0

我正在使用Json解析器處理Solaris 5.8,C++。C++:程序在[memcpy]處發生核心轉儲崩潰

問題是:解析文件的大小大於700 MB時,進程崩潰,核心轉儲錯誤。 它大致出現在下面的代碼點 -

int printbuf_memappend(struct printbuf *p, char *buf, int size) 
{ 
    char *t; 
    if(p->size - p->bpos <= size) 
    { 
     int new_size = json_max(p->size * 2, p->bpos + size + 8); 
     if (!(t = realloc(p->buf, new_size))) 
      return -1; 
     p->size = new_size; 
     p->buf = t; 
    } 
    memcpy(p->buf + p->bpos, buf, size); // CORE DUMP HERE 
    p->bpos += size; 
    p->buf[p->bpos]= '\0'; 
    return size; 
} 

能否請您幫助確定問題?核心轉儲文件僅包含正在複製的數據。可以增加RAM來解決嗎?或者我需要將文件大小限制爲700MB?

+2

如果內存不足是問題,那麼'realloc()'會失敗。問題可能在你的程序中的其他地方,並且它損壞了內存,所以在這裏失敗了。你有沒有使用過像valgrind這樣的調試工具? – Barmar

+0

不,我不太瞭解調試。 我做過幾次使用大小爲250MB,500MB,650MB,700MB,750MB的文件的測試。 該進程終止於700MB。 此外,該進程僅在memcpy函數期間終止。 – user1805010

+1

僅僅因爲它在這裏終止並不意味着問題出在這個函數中。內存損壞留下的時間炸彈幾乎可以在程序中的任何地方消失。這個函數本身看起來很好,所以你需要使用調試工具來解決問題。 – Barmar

回答

0

如果在memcpy中發生崩潰,您有兩個變體 輸入或輸出有問題。

爲了測試第二變型的realloc之後添加的memset:

int new_size = json_max(p->size * 2, p->bpos + size + 8); 
    if (!(t = realloc(p->buf, new_size))) 
     return -1; 
    p->size = new_size; 
    p->buf = t; 
    memset(p->buf + p->bpos, 0, size); 

在Linux(取決於配置)可以分配不存在的虛擬內存。 真正的分配發生在第一次使用後。在你的Solaris上可能發生同樣的情況嗎? relloc return ok,但系統真的沒有足夠的內存? memset應該回答這個問題。

+0

adb ./testJson核心SIGSEGV:Segmentation Fault – user1805010

+0

SIGSEGV但是在memset或memcpy中? – fghj