- Русские Блоги
- проверка утечки памяти кода платформы Linux
- обнаружение утечки памяти в Linux
- cppcheck статическая проверка
- mtrace
- valgrind
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
- поиск утечки памяти
- Русские Блоги
- Несколько инструментов для проверки утечки памяти под Linux
- Для первого пункта ниже будут представлены несколько инструментов проверки утечки памяти.
- Вальгринд объяснил
- Схема памяти программ для Linux
- Принцип проверки памяти
- 1. Таблица действительных значений:
- 2.Valid-Адресная таблица
- Принцип обнаружения
- Установка Valgrind
- использование Valgrind
- Используйте Memcheck, чтобы найти общие проблемы с памятью
- Интеллектуальная рекомендация
- Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
- Создайте многоканальное окно в приложениях Win32
- Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
- Tree——No.617 Merge Two Binary Trees
Русские Блоги
проверка утечки памяти кода платформы Linux
обнаружение утечки памяти в Linux
cppcheck статическая проверка
Вы можете выбрать vscode для установки плагина cppcheck
ps. Невозможно обнаружить слишком сложный код, проверьте следующий код mtrace, mtrace и другие системные вызовы будут мешать результату проверки
mtrace
Нужно добавить в код mtrace() Чтобы проверить целостность кучи, вам также необходимо установить переменные среды MALLOC_TRACE
Добавить параметры отладки при компиляции -g И связать библиотеку -mcheck , Звонок завершает звонок mtrace Проанализировать файл выходных данных
ps. Невозможно обнаружить незаконный доступ к памяти
valgrind
Можно проверить нелегальный доступ, но mtrace Также будет считаться утечкой памяти
проверьте подробную информацию, —leak-check=full -v
Интеллектуальная рекомендация
Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.
Создайте многоканальное окно в приложениях Win32
Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .
Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .
Tree——No.617 Merge Two Binary Trees
Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.
Источник
поиск утечки памяти
Есть встраиваемая система на базе x86 и в ней OpenEmbedded крутится. Со временем, в течение часа, потребление памяти системой возрастает на 10 Мб, и так всё время, видимо до исчерпания.
Есть ли какой-то способ выявить процессы в системе, потребление памяти которыми (не обращая внимания на периодические колебания) имеет тенденцию к увеличению?
Кто как решает эту проблему?
Всякими профилировщиками для поиска утечек памяти относительно единичной программы своей разработки пользоваться умею, а вот как с системой поступить?
Первое, что приходит в голову — собирать скриптом выхлоп
и потом распарсить.
Что такое вообще «потребление памяти системой»?
Объем занятой памяти. Он растет, потом ее не хватит. Свопа в системе нет, да и он не безграничен.
Занятой кем или чем? Как ты увидел, что «память занята системой»?
Я _не_знаю_ что заняло память. Просто свободной памяти становится меньше и это не дисковое кэширование. Просто что-то течет.
Спасибо, интересный метод, надо попробовать.
atop еще умеет статистику собирать.
1. Растут ли процессы? От этого зависит, в ядре искать или в юзерспейсе.
2. Фейлят ли попытки выделить память? Если нет, то память занимается под кэш и в этом ничего страшного нет.
3. Есть ли в ядре самописаные драйверы? Если есть, можно посмотреть /proc/slabinfo — в зависимости от тактики выделения памяти в драйвере, утечка может быть заметна там.
1. это еще надо выяснить — растет общий объем используемой памяти 2. про кэш в курсе, он тут ни при чем 3. нет
Спасибо, попробую atop, не слышал про эту штуку ранее.
1. это еще надо выяснить — растет общий объем используемой памяти
Чудес не бывает — память либо в процессах, либо в кэше, либо в слабах.
2. про кэш в курсе, он тут ни при чем
Отказы в выделении памяти есть или нет?
- Кэш ядра имеет тенденцию съедать всю доступную память
- Проверить не возвращается ли память после вызова
Вангую зелененький блоб втихую жрет.
Вангую зелененький блоб втихую жрет
Пока не занимался этой задачей. Короче, я использую утилиту htop, она показывает что кэш (дисковый в том числе), а что просто занятая память. И я вижу что в течение часа память кушается всё больше и больше. Попробую покилять свои программы, drop_caches тоже попробую.
Гдето на просторах интернетов есть перловый скрипт который это делает для приложений путем периодического парсинга /proc. Кажется он один такой.
Спасибо за наводку, попробую его поискать.
Как ты узнаешь, что потребление памяти растёт?
Оставлю на сутки и посмотрю сколько сожрало. Это когда всё доделаю.
Понял. htop Mem: used: — это used растет, медленно растет, что-то течет.
Какой-то процесс в htop становится безусловным лидером по потреблению памяти? Плодятся ли новые процессы? Если да, то какие?
Ты перепутал с амд.
На рабочем компьютере я вижу что память очень прыгает, но если ничего не делать и смотреть htop то видно что нет тенденции к росту, утечек нет. На целевой же системе ПО, написанное коллегами, видимо что-то не чистит за собой, но! Их ПО это не просто софт на Qt но еще и набор скриптов, может стороннее ПО дает эффект.
Чисто визуально процент потребленной памяти процессами не растет. Лидеры по потреблению тоже не увеличивают процент. Новые процессы не плодятся — есть общий счетчик процессов и он не растет (была ошибка что плодились процессы и я ее пофиксил).
В общем, буду пробовать этот совет выше:
Гдето на просторах интернетов есть перловый скрипт который это делает для приложений путем периодического парсинга /proc. Кажется он один такой.
Источник
Русские Блоги
Несколько инструментов для проверки утечки памяти под Linux
- 1. Правильно ли работает управление памятью (поскольку сама программа открывает много места для памяти для управления кэшем, а сама программа разрабатывается на основе C / C ++, а механизм управления памятью всегда был головной болью для программистов)
- 2. Надежность программы (основное требование любой программы на сервере состоит в том, чтобы соответствовать требованиям высокого уровня параллелизма, то есть, если это основное требование не выполняется, программа не может стать сервером)
Для первого пункта ниже будут представлены несколько инструментов проверки утечки памяти.
инструмент | описание |
---|---|
valgrind | Мощный инструмент обнаружения программ с открытым исходным кодом |
mtrace | Расширение GNU, используемое для отслеживания malloc, mtrace устанавливает функции ловушки для функций выделения памяти (malloc, rellaoc, memalign, free) |
dmalloc | Инструмент для проверки утечек памяти в C / C ++, то есть для проверки наличия памяти, которая не была освобождена после завершения программы, выпущенной как библиотека времени выполнения |
memwatch | Как и dmalloc, он может обнаруживать невыпущенную память, один и тот же сегмент памяти освобождается несколько раз, ошибки доступа к адресам и неправильное использование нераспределенных областей памяти. |
mpatrol | Кроссплатформенный детектор утечки памяти C ++ |
dbgmem | Это также форма динамического выпуска библиотеки с преимуществами, аналогичными dmalloc, но в сравнении она может иметь меньше возможностей |
Electric Fence | Не только может отслеживать malloc () и free (), но также может проверять доступ на чтение и запись, может точно указать инструкцию, которая вызвала ошибку |
Вальгринд объяснил
Valgrind включает в себя следующие инструменты:
- 1.Memcheck: это наиболее широко используемый инструмент valgrind, средство проверки тяжелой памяти, которое может найти большинство ошибок при использовании памяти при разработке, таких как: использование неинициализированного
- 2.callgrind: в основном используется для проверки проблем, возникающих при вызове функций в программе
- 3.cachegrind: в основном используется для проверки проблем использования кеша в программе
- 4.Helgrind: в основном используется для проверки проблем конкуренции в многопоточности
- 5.Massif: в основном используется для проверки проблем с использованием стека в программе
- 6. Расширение: вы можете использовать функции, предоставляемые ядром, чтобы написать свои собственные специальные средства отладки памяти
Схема памяти программ для Linux
- Сегмент кода (.text): здесь инструкция, которая должна быть выполнена ЦПУ. Код является разделяемым. В памяти имеется только одна копия того же кода. В то же время этот сегмент доступен только для чтения, чтобы программа не могла изменять свои собственные инструкции из-за ошибок.
- Инициализируйте раздел данных (.data). Здесь хранятся переменные, которым необходимо явно назначить начальные значения в программе, такие как глобальные переменные, расположенные вне всех функций: int val = 100. Следует подчеркнуть, что два приведенных выше абзаца находятся в исполняемом файле программы, и ядро считывает его из файла исходной программы при вызове функции exec для запуска программы.
- Неинициализированный сегмент данных (.bss). Данные в этом разделе инициализируются ядром до 0 или равны нулю перед выполнением программы. Например, глобальные переменные, которые появляются вне любой функции: int sum, и глобальные переменные и статические локальные переменные, которые не инициализированы или чье начальное значение равно 0
- Куча (кучного). Этот сегмент используется для обращения к динамической памяти в программе, такой как malloc, которая часто используется. Новые серии функций применяются к памяти из этого сегмента.
Инициализированные глобальные переменные и статические локальные переменные с начальными значениями, отличными от 0 - Стек (Stack). Локальные переменные в функции и временные переменные, сгенерированные во время вызова функции, сохраняются в этом разделе. Исполняемый код, строковые литералы, переменные только для чтения.
Принцип проверки памяти
Принципиальная схема Memcheck, выявляющая проблемы с памятью:
1. Таблица действительных значений:
Для каждого байта во всем адресном пространстве процесса есть 8 битов, соответствующих ему, и для каждого регистра ЦП также существует битовый вектор, соответствующий ему. Эти биты отвечают за запись того, имеет ли значение байта или регистра действительное инициализированное значение
2.Valid-Адресная таблица
Для любого байта во всем адресном пространстве процесса также имеется соответствующий 1 бит, который отвечает за запись, может ли адрес быть прочитан или записан.
Принцип обнаружения
- Если вы хотите прочитать или записать байт в память, сначала проверьте бит A, соответствующий этому байту. Если бит A показывает, что это неверное местоположение, memcheck сообщает об ошибке чтения и записи.
- Ядро аналогично среде виртуального ЦП, поэтому при загрузке байта в памяти в реальный ЦП бит V, соответствующий байту, также загружается в среду виртуального ЦП после регистрации Значение in используется для генерации адреса памяти, или значение может повлиять на вывод программы, memcheck проверит соответствующие биты, если значение не было инициализировано, сообщит об ошибке неинициализированной памяти.
Далее я в основном рассказываю об установке и использовании valgrind.Для других инструментов вы можете проверить информацию онлайн, спасибо за сотрудничество!
Установка Valgrind
- 1. Распакуйте установочный пакет
- 1
- 2. Введите каталог для установки
- 1
- 3. Запустите ./autogen.sh для настройки среды (требуется стандартный инструмент автоконфигурации)
- 1
- 4. Настройте Valgrind и сгенерируйте MakeFile
- 1
- 5. Скомпилируйте и установите valgrind
- 1
использование Valgrind
Шаг 1: подготовить программу
Чтобы сделать ошибки, найденные valgrind, более точными, если вы можете найти строку исходного кода, рекомендуется добавить параметр -g во время компиляции и выбрать O0 (не оптимизировать) для опции оптимизации компиляции
Шаг 2: В valgrind запустите исполняемую программу
Используйте valgrind для отладки проблем с памятью без перекомпиляции исходной программы, ее входные данные являются исполняемой двоичной программой. Общий формат вызова Valgrind: valgrind [valgrind-options] your-prog [your-prog-options]
Параметры Valgrind разделены на две категории: одна является основным параметром, который применим ко всем инструментам, а другая — параметром определенного инструмента, такого как memcheck. Инструментом по умолчанию в Valgrind является memcheck. Вы также можете указать другие инструменты через «—tool = имя инструмента». Valgrind предоставляет большое количество параметров для удовлетворения ваших конкретных потребностей в отладке, подробности см. В руководстве пользователя.
Используйте Memcheck, чтобы найти общие проблемы с памятью
Memcheck делит утечки памяти на два типа: один — возможная утечка памяти (возможно, потеряна), а другой — определенная утечка памяти (определенно потеряна). Возможно, потеря означает, что все еще есть указатель, который может получить доступ к блоку памяти, но указатель не указывает на первый адрес памяти. Определенно потеря означает, что к этой памяти больше нельзя получить доступ. Определенно потерянный делится на два типа: прямой и косвенный. Разница между прямым и косвенным заключается в том, что указатель непосредственно на память отсутствует, а косвенный означает, что указатели на память расположены при утечке памяти. В приведенном выше примере корневой узел теряется напрямую, а остальные узлы теряются напрямую.
Интеллектуальная рекомендация
Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)
пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.
Создайте многоканальное окно в приложениях Win32
Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .
Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование
IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .
Tree——No.617 Merge Two Binary Trees
Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.
Источник