0

我正在使用 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?

4

1 回答 1

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 应该回答这个问题。

于 2012-11-07T05:35:52.500 回答