Я работаю над 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 МБ?
Если в 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 return ok, но у системы действительно недостаточно памяти? memset должен дать ответ на этот вопрос.
Других решений пока нет …