← Назад к вопросам

С какими инструментами для обнаружения утечек памяти работал

1.8 Middle🔥 111 комментариев
#Сборка и инструменты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

С какими инструментами для обнаружения утечек памяти работал

За 10+ лет я работал с различными инструментами диагностики утечек памяти в C/C++. Опишу самые эффективные и как их применять на практике.

1. Valgrind (Memcheck)

Самый мощный инструмент для Linux.

Valgrind перехватывает все операции с памятью и отслеживает каждый malloc/free, new/delete:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./program

Пример вывода:

==12345== 48 bytes in 1 blocks are definitely lost in loss record
==12345==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12345==    by 0x4005DE: main (example.c:10)

Преимущества:

  • Показывает точную строку кода, где произошла утечка
  • Работает без пересборки кода
  • Обнаруживает use-after-free, buffer overflows

Недостатки:

  • Медленно (программа работает в 5-10 раз медленнее)
  • На macOS нужны обходные пути

Когда использую: Для разработки и unit-тестов.

2. AddressSanitizer (ASAN)

Современная альтернатива Valgrind, встроена в GCC и Clang.

Быстрее, чем Valgrind (2-3x замедление вместо 10x), обнаруживает ошибки на лету:

gcc -g -fsanitize=address -fno-omit-frame-pointer program.c -o program
./program

Пример обнаружения:

int main() {
    int* arr = new int[10];
    arr[10] = 42;  // Buffer overflow!
    delete[] arr;
    return 0;
}

Вывод ASAN:

=================================================================
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on unknown address
==12345== SUMMARY: AddressSanitizer: heap-buffer-overflow ...

Обнаруживает:

  • Использование памяти после освобождения (use-after-free)
  • Buffer overflows
  • Double-free
  • Утечки памяти

Когда использую: Почти всегда при разработке. ASAN быстрее и удобнее.

3. LeakSanitizer (LSAN)

Специализирован только на утечках, работает быстро.

gcc -g -fsanitize=leak program.c -o program
./program

Коже встроен в ASAN:

gcc -g -fsanitize=address,leak program.c -o program

4. Dr. Memory (Windows)

Аналог Valgrind для Windows.

drmemory.exe -- program.exe

Широко использую при разработке под Windows. Очень удобный GUI с визуализацией утечек.

5. CppCheck

Статический анализ — находит потенциальные утечки без выполнения кода.

cppcheck --enable=all program.c

Пример проблемы:

void func() {
    int* ptr = malloc(100);
    if (some_error) {
        return;  // ptr никогда не освобождается!
    }
    free(ptr);
}

CppCheck найдёт эту проблему статически.

6. Intel VTune

Профайлер с отличной визуализацией памяти.

Мне понравилось для анализа памяти в production-like окружении:

vtune -collect memory-access -r result -- ./program
vtune -report summary -r result

Мой рабочий процесс

На локальной машине:

  1. Компилирую с ASAN/LSAN
  2. Запускаю unit-тесты
  3. Запускаю программу, воспроизвожу ошибки
  4. Если ASAN не поймал — запускаю Valgrind

Пример современного подхода:

#include <iostream>
#include <memory>

int main() {
    // Вместо raw pointer используем умный указатель
    std::unique_ptr<int[]> arr(new int[100]);
    arr[0] = 42;
    // Автоматическое освобождение при выходе из области видимости
    return 0;
}

Компилирую:

g++ -g -fsanitize=address -std=c++17 program.cpp -o program
./program

Автоматизация в CI/CD

В проектах используем:

#!/bin/bash
CC="gcc" CFLAGS="-fsanitize=address,leak -g" make test

Если ASAN находит проблему — тест падает, pipeline останавливается.

Практический совет

Лучший инструмент для большинства случаев — AddressSanitizer (ASAN):

  • Встроен в modern компиляторы
  • Быстро работает
  • Обнаруживает 95% проблем с памятью
  • Легко интегрируется в CI/CD

Когда Valgrind необходим:

  • На старых системах где нет ASAN
  • Для очень тонкой диагностики
  • На macOS (хотя и там работает плохо)

Главный совет: Используйте умные указатели (unique_ptr, shared_ptr) вместо raw malloc/new — это исключит 90% утечек на корню.