Використання _crtBreakAlloc для налагодження розподілу пам'яті


Загальні відомості


Під час відстеження витоків пам'яті за допомогою функції відладки C-Runtime (ЕПТ-програма) часто буває корисно встановлювати точки зупину, перш ніж виділення пам'яті, що спричиняє витік. Настроївши _crtBreakAlloc на час компіляції або часу виконання, ви можете спричинити, що визначена користувачем точка доступу відображається в певній точці виділення пам'яті.

Додаткові відомості


Під час відстеження витоків пам'яті з функціями зневадження-ЕПТ, як-от _CrtDumpMemoryLeaks, відображається число розподілу, що додається в дужках ({}). Наприклад, нижче наводиться витік пам'яті під час виділення номера 18:
   Detected memory leaks!   Dumping objects ->   {18} normal block at 0x00660BE4, 10 bytes long   Data: <          > CD CD CD CD CD CD CD CD CD CD   Object dump complete. 
Це зручно, щоб встановити значення точки зупинки, перш ніж ця пам'ять виділиться, щоб можна було перейти за допомогою функції стек викликів та побачити, які дії є причиною цієї пам'яті, щоб отримати виділені. Функція відладки-ЕПТ-_CrtSetBreakAlloc, яка дає змогу вказати номер розподілу, на який потрібно розірвати. Цей метод вимагає, щоб ви перекомпізайте програму щоразу, коли потрібно встановити точки зупинки. Альтернативним методом є використання вікна "годинник", а також настроювання розподілу точок доступу динамічно. Цей метод має переваги, які не потребують змін у вихідному коді або перекомпілювання. Якщо ви статичної посилання на час виконання C, змінна, яку потрібно змінити, називається _crtBreakAlloc. Якщо ви динамічно посилаються на час виконання C, змінна, яку потрібно змінити в вікні "годинник", буде {, msvcr40d. dll} * __p__crtBreakAlloc (), якщо використовується Visual C++ 4,0 або 4,1. Змінна, яку потрібно змінити в вікні "годинник", має бути {, msvcrtd. dll} * __p__crtBreakAlloc (), якщо використовується Visual C++ 4,2 або пізніша версія. Ось як визначити, яку версію ЕПТ-ви компілюють:
  1. У меню "побудувати" виберіть пункт "Параметри".
  2. У області настройки для: виберіть конфігурацію, для якої ви створюєте. Виберіть вкладку C/C++, а потім виберіть категорію генерація коду.
У діалоговому вікні "використання бібліотеки для запуску" має з'явитися відображення версії ЕПТ, що використовується. (Якщо цей параметр пустий, переконайтеся, що вибрано лише одну конфігурацію в області настройки для:.) Щоб установити значення точки розподілу, виконайте наведені нижче дії.
  1. Запустіть налагоджувальну сесію. У меню "побудувати" натисніть кнопку "налагодження", а потім – > крок. Якщо ви використовуєте "налагоджувальну однопотокове" або "зневаджування багатопотокової ЕПТ", виконайте крок 1a. В іншому випадку виконайте крок 1B.
    1. Введіть _crtBreakAlloc у вікні контрольного списку. Відображається поточний номер розподілу, на якому програма припинить роботу. Цей номер розподілу має бути-1 під час першого завантаження програми.
    2. Введіть {,, msvcr40d. dll} * __p__crtBreakAlloc () у вікні "годинник", якщо використовується Visual C++ 4,0 або 4,1. Введіть {,, msvcrtd. dll} * __p__crtBreakAlloc (), якщо використовується Visual C++ 4,2 або пізніша версія. Відображається поточний номер розподілу, на якому програма припинить роботу. Цей номер розподілу має бути-1 під час першого завантаження програми.
  2. Двічі клацніть значення-1, а потім укажіть новий номер розподілу, що призводить до того, що визначена користувачем точка зупину.
  3. У меню налагодження натисніть кнопку налагодження, > перейти.
Докладні відомості про _crtBreakAlloc можна знайти в онлайновій довідці в розділі "запити на розподіл купи".