Задача ослеживания утечек памяти.

Тема в разделе "LANGS.C", создана пользователем neutronion, 3 мар 2011.

  1. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    2fsd.
    Вы предлагаете на каждое выделение 2-256 байт, выделять по 2 страницы. Это не очень оптимально, если учесть, что код будет в дальнейшем имплантирован в драйвер, как я писал. Но для обычных приложений, решение неплохое. Хотя по моему глубокому убеждению, писать юзерское приложение нужно на безопасных языках таких как Шарп, ява. С нужен для системных вещей, их можно создать в виде библиотек, которые потом можно юзать в Шарповом приложении.
    Делать юзерское приложение на чистом С, думаю это overkill. Тогда уж лучше используя Qt. Прошу не реагировать очень бурно, это только
    мое мнение по шарпу, этот форум о асме и с и заслуживал отдельного топика, который уже был создан и закрыт. Код который я делаю в дальнейшем будет использоваться в драйвере придется только заменить malloc на ExAllocatePool и а free на ExFreePool, и требуется аккуратное программирование уже в юзерленде. И тестировать тщательно сначала в 3 кольце. И отсюда выделять память тоже требуется экономно. Вот собственно и все причины. Кроме того, допустим я выделяю память 10 раз по 255 байт, Хорошо выделили страницу, работаем в ней так как 255 байт * 10 = 2550 байт, в пределы страницы помещаемся. Затем потребовалось 20 по 255 байт получаем 5100 байт, это больше чем страница, нужно снова выделять страницу,
    да еще следить за продолжением выделенного массива, который начинается в одной странице и продолжается в другой, таким образом плавно переходим к тому, что придется создать отдельный менеджер памяти страниц в коде. Так?
     
  2. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Что это такое? Можно конкретную ссылку.
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    neutronion
    чиста конкретную?
    например,
    http://pdos.csail.mit.edu/~baford/vm/
    http://swtch.com/~rsc/papers/vx32/
    ну и кема, бокс, конечно.

    можете даже плугинируемый и скриптабельный чекер замутить типа вг. если вытянете, конечно.
     
  4. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    для верификации так и есть
     
  5. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Сдается мне, что выделение страниц хорошо по следующему сценарию:
    Выделил нужное количество страниц и работаешь до завершения приложения/драйвера. Тогда конечно все упрощается, но страницы будут заняты на постоянку, не знаю насколько это хорошо. С учетом, того, что сейчас много памяти, вроде бы ничего решение. И реально упрощает жизнь, хотя некоторые крутые программисты могут сказать, что это не круто. Опять таки, есть минус. Такой код конечно отслеживает переполнение за пределы страницы, и избавляет от гемора по выделению/освобождению памяти, но он не защищает от переполнения буферов внутри страницы. Что думаете?
     
  6. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    пул вы так кстати не проверите увы, что-то идея ваша начинает идти по наклонной
     
  7. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    отсюда вывод, что выделение памяти плюс 4 байт на cookies не такая плохая идея, для проверки валидности памяти и удаления.
     
  8. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    это неясно
     
  9. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    т.е. Резюмируя:
    1) Выделяем память плюс 4 байт под куки
    2) Пользуемся ею, после использования проверяем, не переписали ли куки
    3) Перед освобождением памяти устанавливаем куку в ноль
    4) После того как думаем, что все освободили ищем куки в памяти,
    которая в тех пределах, где выделяется хип. Если находим, значит имеется косяк и где-то память не освободили.
    (это только в дебажном варианте)
    Код (Text):
    1. #ifdef _debug
    2. #defien COOKA  0
    3. #else
    4. #define COOKA  4
    5. #endif
    6. #define CODE_DEAD 0xc0dedead
    7.  
    8. ...где-то во глубине
    9.  
    10. char *_buff = (char*) malloc(size + COOKA);
    11.             memset(_buff+size,CODE_DEAD,COOKA);
    12.  
    13. #ifdef _debug
    14.          if(!memcmp(_buff[size],CODE_DEAD, COOKA))
    15.                   Alarm();
    16. ...где то освобождаем
    17.        memset(_buff[size],'\0',COOKA);
    18.        free(_buff);
    19.  
    20. ... если после этого находим в памяти куку
    21.        Alarm();
     
  10. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Остался важный вопрос где искать? Возникла такая идея, есть предложение рассмотреть поиск в памяти с точки зрения пределов из математики. То есть:

    -Когда мы выделяем память, то в переменной содержится адрес, это адрес
    виртуальной памяти. Запоминаем его, это будет предел А. Но при выделении памяти у нас имеется также размер выделенной памяти. Это предел Б(если к адресу выделенной памяти прибавить размер). Теперь при любом выделении памяти, мы сравниваем адрес выделенной памяти с пределом А, если он меньше предела А, то обновляем предел А на новый адрес памяти, если адрес новой памяти + размер больше предела Б, то также обновляем предел Б. Таким образом мы имеем диапазон памяти, который имеет тенденцию к расширению, в котором после освобождения памяти и будем искать магическое число. После того как поискали и ничего не нашли обнуляем предел А и предел Б. И все начинается заново.