Утечка памяти
От: ginger24 Россия  
Дата: 01.03.06 13:05
Оценка:
Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет
Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

01.03.06 18:59: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Утечка памяти
От: AntonioDev  
Дата: 01.03.06 13:10
Оценка:
Здравствуйте, ginger24, Вы писали:

G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

Обрати внимание на:
1. Объявление используемых переменных, возможно выделяешь лишнего.
2. В циклах, которые крутятся, видимо что то пишешь, вылезая за рамки выделенной памяти.
3. Нитями пользуешься?
Re: Утечка памяти
От: Kemm  
Дата: 01.03.06 13:13
Оценка:
Здравствуйте, ginger24, Вы писали:

G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

/usr/ports/devel/valgrind

Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там.
Re[2]: Утечка памяти
От: ginger24 Россия  
Дата: 01.03.06 13:24
Оценка:
Здравствуйте, 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);
}
Re[2]: Утечка памяти
От: ginger24 Россия  
Дата: 01.03.06 13:25
Оценка:
Здравствуйте, Kemm, Вы писали:

K>Здравствуйте, ginger24, Вы писали:


G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

K>/usr/ports/devel/valgrind


K>Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там.


А как оно работает, по русски дока есть? А то у меня уже башка не варит
пробовал gdb6 использовать, но не могу им ничего отловить
Re[3]: Утечка памяти
От: Kemm  
Дата: 01.03.06 13:34
Оценка:
Здравствуйте, ginger24, Вы писали:

G>>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
K>>/usr/ports/devel/valgrind
K>>Иногда под FreeBSD работает некорректно, тогда миеет смысл найти линукс и прогнать под valgrind'ом там.
G>А как оно работает, по русски дока есть? А то у меня уже башка не варит

Ставишь, потом запускаешь примерно так:
valgrind --tool=memcheck --trace-children=yes \
         --suppressions=./vg.supp --num-callers=8 \
         --memcheck:leak-check=yes --memcheck:leak-resolution=high \
         /path/to/your/daemon --daemon-arg1 --daemon-arg2 2>&1 | tee vg.log


По выходу демона (или пришибанию valgrind'а SIGTERM'ом) получишь на экране и в vg.log сообщения об ошибках, в том числе о ликах с указанием места выделения памяти.

G>пробовал gdb6 использовать, но не могу им ничего отловить


gdb-то чем поможет утечки ловить?..
Re: Утечка памяти
От: Аноним  
Дата: 01.03.06 13:46
Оценка:
Здравствуйте, ginger24, Вы писали:

G>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?

http://www.linkdata.se/sourcecode.html
Re[2]: Утечка памяти
От: Kemm  
Дата: 01.03.06 13:49
Оценка:
Здравствуйте, Аноним, Вы писали:

G>>Чем омжно отследить утечку памяти? Пишу под g++ FreeBSD, программа в памяти раздувается до размера примерно пол-гига памяти после чего дохнет

G>>Не могу отследить, где там что переполняется, при запуске программа уходит в ежим демона и там крутятся несколько циклов, с чего начать?
А>http://www.linkdata.se/sourcecode.html

- Rudimentary support for C++ (disabled by default, use with care!)


Ну и смысл? valgrind все равно лучше.
Re: Утечка памяти
От: Аноним  
Дата: 01.03.06 13:49
Оценка:
Здравствуйте, ginger24, Вы писали:

G> с чего начать?

Посмотрите эту статью:
http://www.triz-ri.ru/themes/method/creative/creative56.asp
Re[3]: Утечка памяти
От: MaximE Великобритания  
Дата: 01.03.06 14:08
Оценка: 1 (1)
On Wed, 01 Mar 2006 13:24:47 -0000, ginger24 <28982@users.rsdn.ru> wrote:

> AD>3. Нитями пользуешься?

> Да, в зависимости от того какой пришел результат, вот код вызова:

Момент такой: ты создаешь attached thread, что означает ты должен вызвать pthread_join() чтобы получить статус завершения нити и освободить ресурсы завершившейся нити. Либо создавай detached нити, которые освобождают ресурсы сами по завершению, или вызывай pthread_join().

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.