Практическое руководство. Задание точки останова для номера выделения памяти
Обновлен: Ноябрь 2007
Этот раздел применим к:
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
![]() |
![]() |
Только машинный код |
![]() |
Standard |
![]() |
![]() |
Только машинный код |
![]() |
Pro и Team |
![]() |
![]() |
Только машинный код |
![]() |
Обозначения:
![]() |
Применяется |
![]() |
Неприменимо |
![]() |
Команда или команды скрытый по умолчанию. |
![]() |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить настройки, выберите "Параметры импорта и экспорта" в меню "Сервис". Дополнительные сведения см. в разделе Параметры 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-м объектом, выделенным во всем коде. (В некоторых случаях как раз не будет.)
Номер выделения можно использовать для того, чтобы задать точку останова в том месте, где выделяется память. Для этого нужно установить точку останова недалеко от начала программы. Когда выполнение программы будет прервано в этой точке, точку останова в месте, где выделяется память, можно задать из диалогового окна "Быстрая проверка" или окна "Контрольное значение".
Процедура
Установка точки останова для выделения памяти в окне контрольных значений
В окне "Контрольное значение" в столбце Имя введите следующий код:
_crtBreakAlloc
Если используется многопоточная версия DLL библиотеки CRT (параметр /MD), добавьте контекстный оператор:
{,,msvcr71d.dll}_crtBreakAlloc
Нажмите кнопку ВВОД.
Отладчик выполнит оценку вызова и поместит результат в столбец "Значение". Это значение будет равно -1, если в местах выделения памяти не задано ни одной точки останова.
Вместо значения в столбце Значение введите номер выделения памяти, на котором нужно прервать выполнение. Например, введите 18, чтобы прервать выполнение на том выделении памяти, которое описано в приведенном выше примере.
После того как точки останова будут заданы там, где нужно, можно продолжить отладку. Постарайтесь осторожно запустить программу в таких же условиях, как и в предыдущий раз, чтобы порядок распределения памяти не изменился. Когда выполнение программы прерывается на заданном выделении памяти, в окне "Стек вызовов" будут отображаться и другие сведения по отладке. С их помощью можно будет определить условия выделения памяти. При необходимости можно продолжить выполнение программы с этого места, чтобы увидеть, что происходит с объектом, и точнее определить, почему память распределяется некорректно.
![]() |
---|
Иногда полезно задать точку останова на самом объекте. Дополнительные сведения см. в разделе Практическое руководство. Установка точки останова для данных (только машинный код). |
Точки останова для выделения памяти проще установить в отладчике, однако их можно установить и непосредственно в коде.
Чтобы установить точку останова для выделения памяти в коде, выполните следующие действия:
Добавьте следующую строку (для 18-го выделения памяти):
_crtBreakAlloc = 18;
С другой стороны можно воспользоваться функцией _CrtSetBreakAlloc, которая работает точно так же:
_CrtSetBreakAlloc(18);
См. также
Задачи
Практическое руководство. Использование окна стека вызова
Основные понятия
Обнаружение и изоляция утечек памяти