LINUX.ORG.RU

проблемы с new delete


0

0

Сталкивался ли кто-нибудь со следующей проблемой При постоянном (25-50 раз в секунду) выделении памяти большого объема (~250 kb) с последующим ее убиением программа долго не живет. Умирает где-то через сутки. Утечки памяти нет. Проверено не один раз :))


А как она умирает-то? Симптомы какие?

asd
()

прогу прибивает сам линукс. Виртуальный менеджер памяти (если я правильно понял :) ) выводит сообщение что все, каюк проге, и делает ей kill.

liom
() автор топика

И что заставляет тебя думать что нет memory leak'ов?

asd
()

утечек нет. проверялось всякими программами и т.д. top тоже не показывает что течет. прога падает в разное время при остальных равных условиях. Если вместо new delete использовать malloc free то все ОК. где грабли?

liom
() автор топика

Чудес, к сожалению, не бывает, так что грабли наверное все-таки в коде. Лики по топу найти не всегда просто -- понятно, что они могут идти не постоянно, а при наступлении какого-либо события. Можно вот что попробовать: замени в OOM killer'е посылку SIGKILL на SIGABORT, после чего разглядывай кору.

asd
()

2liom: btw, компилятор какой? и это, не может так случайно получиться, что памяти new не хватает? попробуй ловить bad_alloc? и еще, можно попробовать выделять malloc'om а потом использовать new с синтаксисом размещения :)

2asd: а как сие сделать?

anonymous
()

2asd: а как сие сделать?


Это сделать легко: в /usr/src/linux/mm/oom_kill.c:oom_kill_task()
заменить force_sig(SIGKILL, p) на force_sig(SIGABORT, p).
Только толку от этого не будет никакого, така как core-file будет
размером, примерно, RAM+swap :))

Виноват, сразу смайлики ставить надо было...

asd
()

2asd: щютник мля :) хотя что в наше время 1GB файл :) другое дело, что 2GB близко, btw, как в линухе ворочать файлами >=2GB ? :)

PS. интересно, сколько gdb будет такой файл переваривать?!? :)))

anonymous
()

Понимаешь в чем дело, gdb на той же машине этот файл не переварит -- так-как памяти не хватит. А если про файлы больше 2Gb -- посмотри, какой размер у тебя у off_t и все станет ясно.
А потом попробуй:

char c = '!';
int fd = open("/tmp/big.file", O_CREAT|O_TRUNC|O_WRONLY);
lseek(fd, 2030*1024*1024, SEEK_SET);
write(fd, &c, 1);
close(fd);

asd
()

Если программа не шибко много движений делает (вызовов), то попробуй strace -f имя программы > porgram.log

saper ★★★★★
()

2saper:

И что? Вызовы brk() потом считать?

asd
()

2asd: Нет, смотреть хотя бы на каком вызове завалился...

saper ★★★★★
()

Интервал падения одинаков?

После определенного количества вызовов падает или как?

И еще: если у вас RedHat(RPM система или свое ядро) попробуйте (это просто совет, no flame wars) взять готовое ядро от slackware(ну или вашего дистрибутива, на крайний, если используете не его же) с базовыми функциями для вашего железа - чтобы грузилось и работал хотя бы один процессор, потом проверьте упадет ли на нем.

saper ★★★★★
()

> 2asd: Нет, смотреть хотя бы на каком вызове завалился...

2saper: Если посмотреть в начало треда, то становится понятно,
что процесс прибивается OOM killer'ом. OOM killer вызывается при исчерпании памяти. В данной ситуации налицо memory leak'и, которые проявляются быстрее, при использовании new/delete чем mallic/free.

А ядро тут совершенно не причем :))

asd
()

падает всегда через разные промежутки времени. Когда через день а когда через трое суток. Ядро на падучесть не влияет. Библиотеки С/С++ тоже. Компилятор тоже. Тем не менне если переопределить операторы new и delete на malloc free то работает все стабильно! Уже месяц как крутится. В сказки сам не верю! :)

liom
() автор топика
Ответ на: комментарий от Havoc

Скажи пожалуйста версию ядра/linux. А то у нас есть тоже более-менее похожая проблема: машина: 2PIII-800, 1.5 GB OS: RH 6.2, ядро 2.2.14, glibc 2.1.3

Есть много малосвязанных программ. Все юзают stl, iostreams и все ПАДАЮТ через некоторое время при интенсивной работе с памятью причем чуем, что clash где-то между stl и iostream НА многопроцессорной машине(большое подозрение что с strstream). Никто не сталкивался с данной проблемой ?

Еще: 1. Где можно найти самые свежие update для glibc для rh 6.2 ? 2. Что лучше с т.з. стабильности : rh 6.2 или 7.2 (и вообще - если сравнивать разные клоны linux) ?

anonymous
()

Машина Aтлон 1200, 256 мозгов, Линукс Мандрейк 8.0, ядра пробовал разные всякие от 2.2.10 до 2.4.13. libc не помню, компиляторы разные пробовал.

liom
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.