C++: программа аварийно завершает работу с дампом ядра в [memcpy]

Я работаю над Solaris 5.8, C++, используя анализатор Json.

Проблема в следующем: при парсинге файла размером более 700 МБ процесс вылетает с ошибкой дампа ядра. Это примерно происходит в нижней кодовой точке -

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;
}

Не могли бы вы помочь определить проблему? Файл дампа ядра содержит только копируемые данные. Может ли увеличение оперативной памяти быть решением? Или мне нужно ограничить размер файла до 700 МБ?


person user1805010    schedule 07.11.2012    source источник
comment
Если бы проблема заключалась в нехватке памяти, realloc() потерпел бы неудачу. Проблема, вероятно, в другом месте вашей программы, и она повредила память, поэтому здесь что-то не работает. Использовали ли вы какие-либо инструменты отладки, такие как valgrind?   -  person Barmar    schedule 07.11.2012
comment
Нет, я не очень разбираюсь в отладке. Я провел несколько тестов, используя файлы размером: 250 МБ, 500 МБ, 650 МБ, 700 МБ, 750 МБ. Процесс завершается на 700 МБ. Более того, процесс завершается только во время работы функции memcpy.   -  person user1805010    schedule 07.11.2012
comment
То, что он заканчивается здесь, не означает, что проблема в этой функции. Повреждение памяти оставляет бомбу замедленного действия, которая может взорваться практически в любом месте программы. Эта функция сама по себе выглядит нормально, поэтому вам нужно использовать инструменты отладки, чтобы обнаружить проблему.   -  person Barmar    schedule 07.11.2012
comment
С каким сигналом он падает?   -  person Barmar    schedule 07.11.2012
comment
Генерируется только файл дампа ядра. Хвост этого файла состоит из копируемых данных.   -  person user1805010    schedule 07.11.2012
comment
Это бессмысленно. Когда программа дает сбой, вы должны увидеть сообщение об ошибке с сигналом, который ее убил, например, Segmentation violation'. Or when you load the core dump into gdb`, он сообщит вам причину остановки программы. Пожалуйста, вернитесь назад и начните отлаживать свою программу с помощью соответствующих инструментов, здесь мы ничем не можем вам помочь, пока вы не проанализируете ее должным образом.   -  person Barmar    schedule 07.11.2012


Ответы (1)


Если произошел сбой в memcpy, у вас два варианта что-то не так с вводом или выводом.

Для проверки второго варианта добавьте memset после realloc:

    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 (в зависимости от конфигурации) можно выделить несуществующую виртуальную память. Реальное распределение происходит после первого использования. Может ли то же самое произойти на вашем Солярисе? relloc возвращается нормально, но системе действительно не хватает памяти? memset должен дать ответ на этот вопрос.

person fghj    schedule 07.11.2012
comment
adb ./testJson core SIGSEGV: ошибка сегментации - person user1805010; 07.11.2012
comment
SIGSEGV а где, в memset или memcpy? - person fghj; 09.11.2012