Поделиться через


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

Обновлен: Ноябрь 2007

Этот раздел применим к:

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

Тема не применяется Тема не применяется

Только машинный код

Тема не применяется

Standard

Тема не применяется Тема не применяется

Только машинный код

Тема не применяется

Pro и Team

Тема не применяется Тема не применяется

Только машинный код

Тема не применяется

Обозначения:

Тема применяется

Применяется

Тема не применяется

Неприменимо

Тема применяется, но команда по умолчанию сокрыта

Команда или команды скрытый по умолчанию.

w2fhc9a3.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить настройки, выберите "Параметры импорта и экспорта" в меню "Сервис". Дополнительные сведения см. в разделе Параметры Visual Studio.

Имя файла и номер строки в отчете об утечке памяти указывают, где была выделена потерянная память, но этого не всегда достаточно для решения проблемы. Как правило, во время выполнения программы к этому выделению происходит много обращений, но утечку памяти могут вызвать лишь некоторые из них. Чтобы определить проблему, следует знать не только место выделения потерянной памяти, но и условия возникновения утечки. Эти сведения позволят определить номер выделения памяти. Это число, которое отображается в фигурных скобках после имени файла и номера строки. Например, в следующем выводе, номер выделения памяти равен 18. Это означает, что потерянная память — 18-й блок памяти, выделенной для данной программы.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Библиотека CRT считает все блоки памяти, выделенные во время выполнения программы, включая и те, что выделены собственно CRT или другими библиотеками (например, MFC). Следовательно, объект с номером выделения N будет N-м объектом, выделенным в программе, но совсем необязательно будет N-м объектом, выделенным во всем коде. (В некоторых случаях как раз не будет.)

Номер выделения можно использовать для того, чтобы задать точку останова в том месте, где выделяется память. Для этого нужно установить точку останова недалеко от начала программы. Когда выполнение программы будет прервано в этой точке, точку останова в месте, где выделяется память, можно задать из диалогового окна "Быстрая проверка" или окна "Контрольное значение".

Процедура

Установка точки останова для выделения памяти в окне контрольных значений

  1. В окне "Контрольное значение" в столбце Имя введите следующий код:

    _crtBreakAlloc
    

    Если используется многопоточная версия DLL библиотеки CRT (параметр /MD), добавьте контекстный оператор:

    {,,msvcr71d.dll}_crtBreakAlloc
    
  2. Нажмите кнопку ВВОД.

    Отладчик выполнит оценку вызова и поместит результат в столбец "Значение". Это значение будет равно -1, если в местах выделения памяти не задано ни одной точки останова.

  3. Вместо значения в столбце Значение введите номер выделения памяти, на котором нужно прервать выполнение. Например, введите 18, чтобы прервать выполнение на том выделении памяти, которое описано в приведенном выше примере.

После того как точки останова будут заданы там, где нужно, можно продолжить отладку. Постарайтесь осторожно запустить программу в таких же условиях, как и в предыдущий раз, чтобы порядок распределения памяти не изменился. Когда выполнение программы прерывается на заданном выделении памяти, в окне "Стек вызовов" будут отображаться и другие сведения по отладке. С их помощью можно будет определить условия выделения памяти. При необходимости можно продолжить выполнение программы с этого места, чтобы увидеть, что происходит с объектом, и точнее определить, почему память распределяется некорректно.

w2fhc9a3.alert_note(ru-ru,VS.90).gifПримечание.

Иногда полезно задать точку останова на самом объекте. Дополнительные сведения см. в разделе Практическое руководство. Установка точки останова для данных (только машинный код).

Точки останова для выделения памяти проще установить в отладчике, однако их можно установить и непосредственно в коде.

Чтобы установить точку останова для выделения памяти в коде, выполните следующие действия:

  • Добавьте следующую строку (для 18-го выделения памяти):

    _crtBreakAlloc = 18;
    

С другой стороны можно воспользоваться функцией _CrtSetBreakAlloc, которая работает точно так же:

_CrtSetBreakAlloc(18);

См. также

Задачи

Практическое руководство. Использование окна стека вызова

Основные понятия

Обнаружение и изоляция утечек памяти

Другие ресурсы

Окна переменных