Використання налагоджувача gdb в середовищі wxDev-C++ (закінчення)
Оригінал статті: Using
the GNU debugger with wxDev-C++
Автор Tony Reina
Переклав Пилипчук О.П.Читати
першу частинуПокрокове виконання програми
Після досягнення точки зупинки, виконання програми може бути
продовжене різними шляхами:
- Наступний крок
(клавіша: F7): налагоджувач виконає наступну команду
(точніше рядок коду) і зупиниться.
- Крок всередину
(клавіша: Shift+F7): налагоджувач виконає наступну
команду (точніше рядок коду) і зупиниться. Якщо ця команда є викликом
функції, то він перейде до функції і далі крок за кроком виконуватиме
рядки цієї функції аж до повернення в місце виклику функції.
- Продовжити виконання
(клавіша: Ctrl+F8): налагоджувач продовжить
виконання аж до досягнення наступної точки зупинки.
Якщо ваша програма ще призупинена в точці зупинки, спробуйте натиснути
F7,
щоб був виконаний наступний крок. Ви помітите, що курсор у програмному
коді змістився вниз до наступного рядка коду і цей рядок виділено
синім. Точка ж зупинки знову стала червоною.
Якщо ви продовжите натискати
F7, налагоджувач
продовжуватиме виконувати
програму рядок за рядком аж до кінця. Зверніть увагу, що це дуже зручно
в тих частинах програми, де, на вашу думку є логічні помилки або
нескінченні цикли. Ви можете вибірково сповільнювати виконання програми
і бачити результати виконання кожної команди.
Спостереження за змінними
Один з найцікавіших аспектів налагодження - це
можливість бачити значення змінних в даний момент. Таким чином, ви
можете переконатися, що ваша змінна (наприклад, лічильник) має
очікуване значення.
wxDev-C++ може зручно
демонструвати вам вміст класів, рядків, структур/об'єднань, масивів та
інших змінних у вікні
Налаштування (Debug) на вкладці Локальні змінні (Local
Variables):
Зверніть увагу, що на малюнку вгорі змінна iTesta
вже
має значення "5", а значення iTestb
не було присвоєне
(воно є випадковим і залежить від даних, що були в пам'яті).
Тепер залиште вікно Local Variables відкритим і
перезапустіть налагодження. Ви зможете покроково виконувати програму
після точки зупинки (обговорювалось вище)
і побачити, як змінна iTesta
змінить значення з
випадкового на "5".
Додання точок спостереження
Точки спостереження подібні до точок зупинки, але спрацьовують не у
певному рядку програмного коду, а при досягненні певною змінною
вказаного значення. Наприклад, нехай ви підозрюєте, що у вашій великій
програмі змінна iCount
змінюється не у потрібному місці.
Ви можете встановити звичайну точку зупинки (в будь-якому рядку),
запустити налагоджувач до точки зупинки, а потім додати спостереження
за значенням iCount
. Після цього налагоджувач буде завжди
зупинятися при зміні значення iCount
.
Щоб встановити точку спостереження, додайте в код звичайну точку
зупинки і запустіть налагодження. У вікні Налаштування (Debug)
клацніть вкладку Watches. Потім клацніть правою
кнопкою на вільному місці вкладки Watches. З'явиться
меню з командою Додати в спостережувані (Add
Watch)
(клавіша: F4).
Коли ви виберете Додати в спостережувані (Add
Watch), з'явиться діалогове вікно:
Наберіть у ньому ім'я змінної і натисніть Гаразд (OK). Якщо виділити слово в поточному
файлі і натиснути
F4, то виділений текст буде доданий до списку
спостережень без запиту щодо імені змінної. Зупинка може відбуватись
при читанні змінної, при запису в неї або в обох випадках разом.
Встановлена точка спостереження продовжує діяти при наступних
запусках налагодження. Крім того, ви можете змінити значення
спостережуваної змінної під час налагодження, клацнувши правою кнопкою
її ім'я у вікні Налаштування (Debug) на вкладці Спостереження
(Watch) і вибравши Змінити спостережувану змінну
(Modify watched variable).
Зверніть увагу, що ви змінюєте значення за межами програмного коду. При
наступному запуску налагоджувача введене значення буде втрачене і
програма працюватиме у звичайному режимі.
Важливі зауваження:
- При використанні вказівників на структури або класи, якщо ви
хочете побачити всі члени змінної my_pointer, то потрібно
відслідковувати *my_pointer (‘*’ - оператор-значення).
Слідкуючи просто за my_pointer, ви побачите лише адресу, що
зберігається у my_pointer.
- Іноді
налагоджувач не може визначити тип вказівника, і тому не може показати
всі члени структури або класу. Ви можете уникнути цієї проблеми,
вказавши тип спостережуваної змінної. Наприклад, якщо налагоджувач не
може продемонструвати вміст змінної my_pointer типу MyPointer,
спробуйте додати спостереження за: *(MyPointer
*)my_pointer.
Зворотне трасування
Ідея зворотного трасування полягає в тому, що вам повідомляють, які
функції викликались перед досягненням точки зупинки або перериванням
(наприклад. помилкою доступу або іншою помилкою періоду виконання).
Проведемо експеримент. Встановіть
точку
зупинки у своєму проекті
sampleDebug
в рядку
printf
,
що у функції
test2
(12-й рядок). Після цього
перезапустіть налагодження (клавіша
F8). Якщо у вікні
Налаштування (
Debug) ви виберете вкладку
Відслідковувати
(
Backtrace), ви побачите приблизно таке:
Тут показано список функцій, які викликались (починаючи від запуску
програми), перед досягненням точки зупинки. Клацнувши (у версії 7.3.1.3
- двічі -
О.П.) назву функції у списку, ви побачите її
реалізацію в коді програми. Так, наприклад, якщо ви клацнете (двічі -
О.П.)
test
,
IDE покаже вам рядок 19 вихідного коду. Зауважте, що змінні-аргументи,
що були передані у функцію, показані разом з їхніми поточними
значеннями.
Тепер розкоментуйте рядки 24-27 у функції
test
. При
спробі запустити налагодження, програма викличе помилку доступу
(access violation) і зупиниться. IDE продемонструє, в якому рядку
виявлена помилка, а на вкладці
Відслідковувати (
Backtrace)
буде показано поточні змінні та їхні значення.
Використання вікна процесора
wxDev-C++ надає вікно поцесора, яке дозволяє кваліфікованим розробникам
слідкувати за станом регістрів процесора та командами.
Щоб побачити вікно процесора, дочекайтесь, доки буде досягнута точка
зупинки або робота програми буде перервана, і перейдіть до меню
Налаштування (
Debug), де клацніть
Показати вікно
CPU. З'явиться таке
діалогове вікно:
Ліворуч ви побачите асемблерний код поточної функції. Ви можете
побачити асемблерний код будь-якої з функцій, набравши її назву у полі
Функція (
Function) і натиснувши
Enter.
Можна також обрати синтаксис команд
асемблера:
AT&T або
Intel.
Праворуч показано вміст регістрів процесора.
Интернет реклама