簡體   English   中英

C ++:程序因[memcpy]的核心轉儲而崩潰

[英]C++: Program crashes with core dump at [memcpy]

我正在使用Json解析器在Solaris 5.8,C ++上工作。

問題是:解析大小大於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?

如果崩潰的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返回確定,但是系統確實沒有足夠的內存嗎? memset應該給出這個問題的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM