Утечка памяти

Тема в разделе "Lotus - Программирование", создана пользователем Itar, 18 янв 2010.

  1. Itar

    Itar Гость

    Добрый день!
    Проблема заключается в следующем: нужно написать агент, который будет опрашивать lotus сервера и считывать через определенные промежутки времени некоторые значения из базы данных. После запуска программы она разрастрается в памяти. Подскажите в чем может быть проблема?
    Ниже приводится код программы, которая разрастается
    Код (C++):
    #include <iostream.h>
    #include <lncppapi.h>
    #define ERR_BUF_SIZE 512
    void main()
    {
    LNNotesSession  Session;
    LNDatabase  Db;
    LNString DbTitle;
    while(true)
    {
    try
    {
    Session.Init();
    Session.GetDatabase("Mail.box", &Db,"Test01");
    Db.Open();
    DbTitle = Db.GetTitle();
    cout<<DbTitle<<endl;
    }
    catch (LNSTATUS Lnerror)
    {
    char ErrorBuf[ERR_BUF_SIZE];
    LNGetErrorMessage(Lnerror, ErrorBuf, ERR_BUF_SIZE);
    cout << "Error: " << ErrorBuf << endl;
    }
    Db.Close();
    Session.Term();
    Sleep(5000);
    }
    }
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    1. Это не тот топик для этой темы.
    2. Само собой, что она разрастается в памяти!
    Вместо бесконечного цикла используйте таймер с интервалом в 5 сек.! И все будет нормально.
     
  3. Itar

    Itar Гость

    Там в конце цикла стоит Sleep(5000), можно поставить задержку и больше, но программа все равно будет разрастаться
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Течет где-то внутри Лотуса... Возможно, нужны какие-то дополнительные вызовы для деинициализации объектов. Может LNString тоже нужно "закрывать".
    P.S. Перемещу-ка я вашу тему к Лотусистам, может там вам быстрее подскажут
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
    я уже давно не прогал на сях, но локальная переменная в цикле... и воще жрёт стек
    вот ругань на подобные "фокусы"
    http://www.xakep.ru/magazine/xa/117/116/1.asp
    непонятен "фокус" с закрытием сессии - это ещё зачем?
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Какая? Не вижу...
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
    char ErrorBuf[ERR_BUF_SIZE];
     
  8. Itar

    Itar Гость

    Попробывал без этой переменной, все равно разрастается

    Это на случай, если сервер лежит
    Но там правильно надо писать
    Код (Text):
    if (Session.IsInitialized ()) Session.Term();
    Утечек при открытии и закрытии сессия нет, они появляются при работе с бд

    Пробывал прогонять через Deleaker программы-примеры, котооые идут вместе с библиотеками Lotus для с++, он тоже показывает утечки. Но мне кажется странным, что IBM до сих пор это не исправил, я пользуюсь 8-ой версией библиотеки.
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Так она же в обработчике исключительной ситуации, которой может и не быть. И будет удалена при выходе из обработчика. Тут все ОК

    Добавлено:
    Вот и ответ ;)
     
  10. Itar

    Itar Гость

    В смысле, что библиотеки паленые?
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
    нет не всё ок ;)
    зачем там локальный буфер, на стеке, да ещё 512 байт...
    строка туда попадет терминированная
    а вот выделение памяти, при срабатывании эксепшена - совершенно не нужно, статик вполне подходит

    а вот заворачивание стека - вполне может привести к утечкам, и чем меньше мы в него пихнем (а уж буферов - точно), тем устойчивее будет
     
  12. Itar

    Itar Гость

    Я смотрю размер программы по диспетчеру задач, может он врет?
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Чтобы перевести лотусиную строку в сишную
    Но не в это случае
    Он показывает не размер выделенной вашим кодом памяти. Подробности есть здесь: http://gunsmoker.blogspot.com/2009/05/blog-post_24.html.
    Если желаете разобраться в деталях, то в статье есть 2 ссылки Марка Руссиновича
     
  15. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    У Нотеса есть кэши открытых БД. Потому первоначальный рост используемой виртуальной памяти вполне обоснован. Попробуйте погонять ваш цикл подольше, чтобы кэши полностью заполнились или уже нечего было в них помещать. После этого и анализируйте утечки. Таскменеджеру не верьте, особенно для больших значений VM. Используйте PerfomanceMonitor, встроенный в винды (ControlPanel\AdministrativeTools\Perfomance). Он показывает точные данные, позволяет строить графики и наглядно посмотреть оценить утечки.

    Добавлено:
    Так однозначно сложно утверждать, т.к. можно добавить колонку с виртуальной памятью.
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
    ключевые слова - "на стеке", а не "зачем буфер"

    вы знаете какой размер стека выделяется и в каких случаях и на каких платформах, и сколько уже отъедено процессом,
    вложенность вызовов...?;)

    теперь представим, что в таком стиле (не используя статики для буферов, или кучу, а пихая их в стек) пишут и другие проггеры
    есть оригиналы - туды и объекты пихают...
    а потом удивляемся непредсказуемости софта

    пропуская лирику... - обозначить буфер статиком, я полагаю, "религия" никому не мешает ;)
     
  17. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Религия религией, но к данному вопросу об утечках она имеет отстранённое отношение, т.к. переменные на стеке выделяются при входе в область видимости. В данном случае, память стековая память под ErrorBuf выделится только при срабатывании catсh.
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.078
    Симпатии:
    300
    есть стиль программирования
    вот буфера на стэке - порочная, глюкопроизводящая составляющая
    просто переменные - да пусть с ними (это нормально), а буфера - это через край
    ну представьте - случился кэтч, стек завернулся (очередной умелец, в вызывающих ф-циях его также и "выжрал") и чё поимеем - гимор!

    а так - да, к конкретному вопросу (и коду), учитывая малость кода, можем "плюнуть"...
    но код выше не имеет практической значимости (только ка тест или пример), а на будующее - надо обязательно учитывать
     
  19. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Замечу, что в момент отработки catch'а в вызывающих функциях стек, занятый вызываемыми, уже освободится.
     
  20. K-Fire

    K-Fire Гость

    А сколько конкретно памяти то утекает? А то может ради пары сотен килобайт не стоит и возиться.
     
Загрузка...

Поделиться этой страницей