Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет
Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
01.03.06 18:59: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, ginger24, Вы писали:
G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
Обрати внимание на:
1. Объявление используемых переменных, возможно выделяешь лишнего.
2. В циклах, которые крутятся, видимо что то пишешь, вылезая за рамки выделенной памяти.
3. Нитями пользуешься?
Здравствуйте, ginger24, Вы писали:
G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
/usr/ports/devel/valgrind
Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там.
Здравствуйте, AntonioDev, Вы писали:
AD>Здравствуйте, ginger24, Вы писали:
G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
AD>Обрати внимание на: AD>1. Объявление используемых переменных, возможно выделяешь лишнего.
Везде где использую malloc realloc после этого делаю free _NAME
там где new — делаю delete _NAME, открытые файлы закрываю, может быть где то еще неправильно...
Например в конструкции вида if else у меня объявляются переменные, char vv[256], соответственно они только там используются, может быть из-за этого?
AD>2. В циклах, которые крутятся, видимо что то пишешь, вылезая за рамки выделенной памяти.
там два икла, один в другом, первый — на коннект к серверу, если обрывается то просто заново тчо бы соединялся, вида while(true), второй собственно цикл постонного приема данных.
AD>3. Нитями пользуешься?
Да, в зависимости от того какой пришел результат, вот код вызова:
int *sleeptime, retval;
sleeptime = (int *)malloc(sizeof(int));
*sleeptime = timeR-(timeR/10);
retval =pthread_create(&tid[0], NULL, sleeping, (void *)sleeptime);
if (retval != 0)
{
log_message("[A] Error, could not create thread");
}
#ifdef DEBUG_INFO
else
{
sprintf(logmes, "[D] Next time authorisation remain %i sec of %i.",*sleeptime,timeR);
log_message(logmes);
}
free sleeptime;
#endif
собственно сам процесс:
void *sleeping(void *arg)
{
int sleep_time = *(int *)arg;
sleep(sleep_time);
#ifdef DEBUG_INFO
printf("\n\t[A] Next authorisation %i is awakening!\n", (int)pthread_self());
#endif
char Buf[LenA];
Buf[0] = ZTS_Reg_AVTORIZATION;
int dx=(int) (rand()%256+1); Buf[1] = dx;
dx=(int) (rand()%256+1); Buf[6] = dx;
Buf[7] = Enabled_Build;
*( (unsigned long *)&Buf[2] ) = dA;
#ifdef DEBUG_INFO
printf("\t\t\t[A] - Buf: %lu", *( (long *)&Buf[2] ));
#endif
int sendbytes = send(sock,Buf,LenA,0);
if(sendbytes == -1)
printf("\t[A] Connect Dropped!\n");
#ifdef DEBUG_INFO
else
printf("\t[A] Success! Sent %i bytes of %i!\n",sendbytes, LenA);
#endif
pthread_exit(NULL);
}
Здравствуйте, Kemm, Вы писали:
K>Здравствуйте, ginger24, Вы писали:
G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
K>/usr/ports/devel/valgrind
K>Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там.
А как оно работает, по русски дока есть? А то у меня уже башка не варит
пробовал gdb6 использовать, но не могу им ничего отловить
Здравствуйте, ginger24, Вы писали:
G>>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать? K>>/usr/ports/devel/valgrind K>>Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там. G>А как оно работает, по русски дока есть? А то у меня уже башка не варит
По выходу демона (или пришибанию valgrind'а SIGTERM'ом) получишь на экране и в vg.log сообщения об ошибках, в том числе о ликах с указанием места выделения памяти.
G>пробовал gdb6 использовать, но не могу им ничего отловить
gdb-то чем поможет утечки ловить?..
Re: Утечка памяти
От:
Аноним
Дата:
01.03.06 13:46
Оценка:
Здравствуйте, ginger24, Вы писали:
G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
Здравствуйте, Аноним, Вы писали:
G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать? А>http://www.linkdata.se/sourcecode.html
- Rudimentary support for C++ (disabled by default, use with care!)
On Wed, 01 Mar 2006 13:24:47 -0000, ginger24 <28982@users.rsdn.ru> wrote:
> AD>3. Нитями пользуешься? > Да, в зависимости от того какой пришел результат, вот код вызова:
Момент такой: ты создаешь attached thread, что означает ты должен вызвать pthread_join() чтобы получить статус завершения нити и освободить ресурсы завершившейся нити. Либо создавай detached нити, которые освобождают ресурсы сами по завершению, или вызывай pthread_join().