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 でクラッシュが発生した場合、入力または出力に問題がある 2 つのバリアントがあります。

2 番目のバリアントをテストするには、再割り当ての後に 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 は OK を返しますが、システムに十分なメモリがありませんか? memset は、この質問に対する答えを提供する必要があります。

于 2012-11-07T05:35:52.500 に答える