загрузка...
загрузка...
На головну

тестування

  1.  VV Тестування реальності за допомогою кнопки на масці DreamLink'а
  2.  адаптивне тестування
  3.  МУЛЬТІРИНОЧНОЕ ТЕСТУВАННЯ СИСТЕМИ
  4.  Оціночна тестування
  5.  Проблеми, пов'язані з тестуванням статистичних гіпотез
  6.  психологічне тестування
  7.  Реакція на тестування

Припустимо, що вивчається деяка випадкова величина X. З цією метою проводиться ряд незалежних випробувань, в кожному з яких величина X приймає те чи інше значення. Сукупність отриманих значень x1, x2, ..., Xn величини X, де n - Число випробувань, називають вибіркою або статистичним рядом. Цей ряд грає роль числового матеріалу, що підлягає подальшій обробці і аналізу. Розробкою методів, що дозволяють за результатами обстеження вибірки робити обґрунтовані висновки про характер випадкової величини X, займається математична статистика. Ця наука виникла в 17 столітті і розвивалася паралельно з теорією ймовірностей. На практиці методи математичної статистики використовуються в тих випадках, коли потрібно вивчити розподіл великої сукупності предметів за певною ознакою, наприклад, розподіл безлічі людей за віком і т.д. Так як практично будь-яка ознака допускає кількісну оцінку, то, замість того щоб говорити про розподіл предметів за ознакою, можна говорити про розподіл деякої випадкової величини. З цієї точки зору, випробування, з яким пов'язана випадкова величина, полягає у виборі навмання одного представника даної сукупності, а значення, яке приймається випадковою величиною, тобто значення ознаки для цього представника. Введемо таке визначення.

Визначення 1. Вибірковою сукупністю (вибіркою або статистичним рядом) Називається сукупність випадково відібраних об'єктів. Генеральною сукупністю називається сукупність всіх об'єктів, з яких виробляється вибірка. об'ємом сукупності (вибіркової чи генеральної) називається число всіх об'єктів цієї сукупності.

Нехай з генеральної сукупності витягнута вибірка обсягом n. Розташуємо результати вибірки в таблиці.

i (Номер випробування)  ... n
 значення ?i випадкової величини X в i-м випробуванні ?1 ?2  ... ?n

Серед наведених значень випадкової величини X можуть бути й однакові. Об'єднавши рівні значення випадкової величини X, Отримаємо наступну таблицю:

 значення xi випадкової величини X x1 x2  ... xk
 число xi появ значення xi n1 n2  ... nk

де k - Число різних можливих значень величини X.

Визначення 2. Спостережувані в вибірці значення x1, x2, ..., Xk випадкової величини X називають варіантами, А послідовність варіант, записаних у зростаючому порядку - варіаційним рядом.

числа n1, n2, ..., Nk називають частотами відповідних значень випадкової величини X. ставлення частоти ni до обсягу вибірки n називається відносної частотою значення xi і позначається через wi, Т. Е.

, .

Очевидно, що сума частот усіх значень випадкової величини дорівнює обсягу вибірки, тобто n1 + n2 + ... + Nk = n. Відзначимо також, що

,

тобто сума відносних частот всіх значень випадкової величини X дорівнює одиниці.

Визначення 3. Статистичним розподілом випадкової величини X називають перелік варіант і відповідних їм частот або відносних частот.

Як правило, статистичний розподіл записують у вигляді таблиці (1):

X x1 x2  ... xk
w w1 w2  ... wk

якщо X - Безперервна випадкова величина, то її статистичний розподіл доцільно представити у вигляді:

X (c1, c2) [c2, c3)  ... [cs-1, cs)
W w1 w2  ... wk

де (cs-1, cs) (Або [cs-1, cs)) - Проміжок, якому належать всі можливі значення випадкової величини X, а wi - Відносна частота влучень випадкової величини X в даний проміжок.

Для наочності статистичний розподіл дискретної випадкової величини ілюструється полігоном розподілу: точки з координатами (x1, w1), (x2, w2), ..., (xk, wk) Зображують на координатної площині і з'єднують їх прямолінійними відрізками:

Для ілюстрації розподілу неперервної випадкової величини використовуються гістограми - ступінчасті фігури, що складаються з прямокутників, підставами яких служать інтервали (ci, ci+1),  , А площі прямокутників дорівнюють відповідно wi, :

Гістограма являє собою наближення графіка щільності розподілу неперервної випадкової величини.

Розглянемо числові характеристики дискретної випадкової величини, заданої статистичним розподілом.

Визначення 4. Середнім значеннямвипадкової величини X, Заданої статистичним розподілом (1), називають число  , рівне

 (2)

число  визначає середнє значення X для вибірки. Якщо в якості вибірки розглядати всю генеральну сукупність (обсягу N), То число  буде являти собою ймовірність, з якою випадкова величина X приймає значення ,  , І рівність (2) можна записати у вигляді

.

Це означає, що для вибіркової сукупності досить великого обсягу справедливо .

Визначення 5. Статистичної дисперсією випадкової величини X, Заданої статистично розподілом (1), називається число

 (3)

З рівності (3) випливає, що число  є середнім значенням випадкової величини  . Тому при великому обсязі вибірки має місце наближена рівність .

Визначення 6. число  називають середнім квадратичним відхиленням випадкової величини X, Заданої статистичним розподілом (1).

тестування

Тестування та налагодження йдуть рука об руку, так що більшість програмістів просто не сприймають їх як окремі етапи розробки програм. Однак шлях до успіху лежить через поділ процесу налагодження і тестування на два різних етапу роботи над програмою, і вам слід чітко уявляти собі, що мета тестування - визначити наявність (або відсутність) помилок, В той час як мета налагодження - визначити місце розташування помилок і усунути їх. Оскільки цілі цих двох етапів розробки програм різні, різні і використовувані для цього методи і інструменти.

Створення надійного додатки
 Кращий шлях виключити помилки в програмі - захиститися від них ще при написанні коду. Надійне додаток - додаток, що створюється з можливістю легко і просто налагоджувати його. Ось основні поради, які допоможуть вам зменшити кількість помилок при розробці програм.

  • Ваша програма повинна бути добре організовано. Розділіть програму на модулі, кожен з яких виконує певні завдання. Наприклад, якщо код, який створює звіт, рознесений по десяти модулів, час налагодження такого коду збільшиться навіть більш ніж в десять разів (хоча б за рахунок пошуку потрібної рядки в десяти модулях). Звичайно ж, ви можете викликати підпрограми з інших модулів, але вони повинні бути створені для виконання чітко поставленого завдання. Нерозумно розміщувати одну половину виконуваної операції в процедурі в одному модулі, а другу половіну- в іншій процедурі (тим більш-в іншому модулі). Нехай це примітивний рада, але він є одним з найдієвіших! Порядок - перш за все! Порядок в думках і в програмі!
  • Захистіть себе від дурня. Якщо ваша процедура не може переварити некоректні дані і викликати тим самим крах всієї системи, перевірте цілісність вхідних даних, перш ніж працювати з ними. Однак пам'ятайте: якщо системою зможе скористатися будь-який дурень, значить, тільки дурень і буде нею користуватися. Не захоплюйтеся надмірною захистом, яка невблаганно буде відбирати час і ресурси, необхідні для виконання більш важливих завдань.
  • Використовуйте оцінний варіант вашої програми. У налагоджувальної версії програми міститься додатковий код, мета якого - відстежити виконання програми, переконатися в коректності її роботи і спростити налагодження вашої програми. Саме про це і розповідається в наступному підрозділі.

Отладочная і комерційна версії коду
 Ті, хто брали участь в "польових випробуваннях" (відомих як бета-тестрірованіе) комерційних програм, напевно звернули увагу, що такі версії програм повільніші, набагато більш "балакучі" і розміром побільше остаточних версій програм. Може бути, розробник поспішав і випустив "сирий" продукт, який буде покращувати перед випуском остаточного варіанту? Так теж буває, але головна причина в іншому: в бета-версії міститься тестовий і оцінний коди, що використовуються розробником для перевірки коректності роботи програми.
 Delphi дозволяє дуже легко внести тестовий і оцінний коди в додаток. Наприклад, ви хочете створити додаток роботи з базою даних і використовувати швидкий, але, можливо, дещо ризикований алгоритм сортування даних. Як же переконатися в коректності його роботи? Один із шляхів - використовувати в додатку два алгоритму одночасно (швидкий, але ризикований, і повільний, але перевірений), потім порівняти результати роботи обох алгоритмів. Звичайно ж, цей варіант використовується тільки в бета-версії, і після всебічного тестування, якщо все працює відмінно і без збоїв, в кінцевій версії продукту залишиться тільки швидкий (і після такого тестування - вже не ризикований) метод сортування.
 Для цього вам зовсім не треба використовувати два різних тексту програм - скористайтеся можливістю умовного компілювання. Ви можете визначити символ (я зазвичай використовую Debug, але ви вільні у вашому виборі) для перемикання між комерційною та налагоджування версіями вашого коду з використанням директив $ IFDEF, $ IFNDEF, $ ELSE і $ ENDIF. Ось приклад використання "повільного" алгоритму в налагоджувальної версії.

DataSet: = GetData; // Отримання даних для сортування.
 {$ Ifdef Debug}
 TestResultSet: = Sort_Tortoise (DataSet); // Повільно і надійно.
 {$ Endif}
 ResultSet: = Sort_Hare (DataSet); // Швидко і ризиковано.
 {$ Ifdef Debug}
 if not CompareData (ResultSet, TestResultSet) then
 // Результати збіглися?
 Raise Exception.Create ( 'Сортування в DataSorting некоректна');
 {$ Endif}

Якщо визначено символ Debug, код приймає наступний вигляд.

DataSet: = GetData; // Отримання даних для сортування.
 TestResultSet: = Sort_Tortoise (DataSet); // Повільно і надійно.
 ResultSet: = Sort Hare (DataSet); // Швидко і ризиковано.
 if not CompareData (ResultSet, TestResultSet) then
 // Результати збіглися?
 Raise Exception.Create ( 'Сортування в DataSorting некоректна');

Якщо ж символ Debug не визначений при створенні комерційного варіанту програми, код вироджується в алгоритм швидкого сортування без додаткових перевірок

DataSet: = GetData; // Отримання даних для сортування.
 Re5ultSet: = Sort_Hare (DataSet); // Швидко і ризиковано.

Як бачите, використання умовної компіляції - простої спосіб створення як отладочной, так і комерційної версій програми Ви можете визначити символ умовної компіляції двома шляхами. Перший - глобальне визначення символу в опціях проекту. Виберіть команду Project / Options і в діалоговому вікні Project Options, у вкладці Directories / Conditionals, введіть символ в полі Conditional defines. На рис 2.1 показано визначення двох символів (Debug і Alpha) Клацніть на кнопці ОК для підтвердження вашого введення

Порада:Змінивши символи умовної компіляції, Перекомпілюйте проект за допомогою команди Project / Build All для того, щоб врахувати внесені зміни.

Інший метод визначення символу умовної компіляції - вставити в ваш вихідний код директиву.

{$ Define Debug}

Ймовірно, ви не захочете возитися з кожним файлом, що входять в проект, і віддасте перевагу визначити символ глобально. Однак можлива ситуація, коли, включивши символ умовної компіляції глобально, ви захочете відключити його в деяких модулях. Для цього використовуйте в файлі директиву

{$ Undef Debug}

Вона відключає відповідають вимогам Директиви ЄС Debug до тих пір, поки не зустрінеться відповідна директива $ DEFINE або кінець поточного файлу. Звичайно, ви можете використовувати ці директиви як завгодно часто і в тих місцях, де вважаєте за потрібне.
 Крім директив умовної компіляції, є ще чимало інших директив, які можуть використовуватися в налагоджувальної версії додатка. Я говорю "можуть", Оскільки ці директиви можуть внести певні відмінності в код комерційної та тестової версій, так що будьте обережні при їх застосуванні. Ці опції перераховані у вкладці Compiler діалогового вікна Project Options, наведеного на рис 2.2

Мал. 2.1.Використання діалогового вікна Project Options для визначення символів умовної компіляції

рис 2.2. Використання діалогового вікна Project Options для зміни налагоджувальних опцій компілятора

Нижче наведено опис цих опцій.

  • Optimization. Ця опція управляє оптимізацією компілятора. Рекомендується залишити цю опцію включеною і вимикати її, якщо ви вважаєте, що оптимізація вносить помилки в вашу програму. Управляти оптимізацією локально ви можете за допомогою директив компілятора $ 0 + і $ 0-.
  • Stack Frames. Якщо ця установка включена, компілятор завжди включає в функцію код для генерації кадру стека, навіть якщо код не використовує стек. Як і в разі оптимізації, вам навряд чи варто змінювати цю установку. Локальні директиви компілятора- $ W-t і $ W-.
  • Range Checking. Перевірка діапазону перехоплює помилки, викликані виходом за межі масиву або рядка. Однак додатковий код стримує виконання програми і, по всій видимості, ви вимкніть цю опцію в комерційній версії. Директиви компілятора для включення і відключення проверкі- $ R + і $ R-.
  • Assertions (С). Ця опція більш повно описана в наступному розділі. Використання даного типу перевірок дозволяє швидко і просто додати перевірки в код Природно, в комерційній версії ви захочете відключити цю можливість. Директиви компілятора- $ З + і $ С-.
  • Overflow checking (Q). Перевірка на переповнення дозволяє з'ясувати, чи не є результат виконання целочисленной операції занадто великим для розміщення його в змінної. Подібно опції Range Checking, дана опція корисна тільки при налагодженні, і в комерційній версії, як правило, відключається. Директиви компілятора- $ Q + і $ Q-.

Отладочная версія вашого коду, ймовірно, буде більше за розміром і повільніше комерційної версії. Тому не передайте випадково кінцевому користувачеві отладочную версію!

Використання директиви Assert
 Оператор Assert- новий оператор в Delphi 4. В дійсності це просто тест на логічну істину / брехня. При використанні цього оператора ви переконуєтеся, що логічне вираз істинний, якщо при виконанні вираз стає помилковим, генерується виняткова ситуація. Синтаксис використання оператора такий:

Assert (<логічний вираз)

Ви можете використовувати перевірку, наприклад, на початку процедури для з'ясування коректності параметрів, як показано нижче.

procedure Foo (Count: Cardinal);
 begin
 Assert (Count  end;

Якщо вираз виявиться хибним, з'явиться повідомлення про помилку, подібне показаному на рис. 2.3. Звичайно ж, у вас вже крутиться на язиці питання, чому ж це відрізняється від конструкції if ... else. Справа в тому, що управляти генерацією коду для оператора Assert дуже легко і просто за допомогою директиви компілятора. Для застосування описаних можливостей використовуйте директиву $ ASSERTIONS ON або $ З +, а для відключення дії Assert- $ ASSERTIONS OFF або $ С - (при цьому компілятор ігнорує оператори Assert і код для них не генерується).

Мал. 2.3.Повідомлення про помилку Assert

Оскільки ви явно захочете включити цю можливість в отладочную версію і виключити її з комерційною, використовуйте код, подібний до наведеного нижче.

{$ Ifdef Debug}
 ($ ASSERTIONS ON)
 {$ Else}
 ($ ASSERTIONS OFF)
 {$ Endif}

Якого типу виразу можуть використовуватися в операторі Assert? Будь-якого (звичайно, якщо воно повертає логічне значення). Однак тут є свої маленькі підводні камінчики, про які легко подряпатися. Уявіть собі, що у вас є деяка функція, наприклад з'ясовує, скільки разів вона була викликана.

function CountMe: Integer;
 const ReferenceCount: Integer = 0;
 begin
 Inc (ReferenceCount);
 Result: = ReferenceCount;
 end;

Припустимо, що ви викликаєте її в операторі Assert. Таким чином, в комерційній версії, яка ігнорує всі оператори Assert, кількість викликів функції буде не таким, як в налагоджувальної версії. Так що будьте уважні і обережні.

модульне тестування
 Тема модульного тестування обширна і різноманітна, і писати про неї можна багато, але я обмежуся буквально кількома словами. До речі, коли мова йде про модульному тестуванні, слово модуль не має відношення до концепції модулів Delphi і має на увазі функцію, підсистему або інший добре певний програмний модуль.
 Коротко кажучи, ідея модульного тестування полягає в розбивці додатки на функціональні одиниці і тестуванні кожної з них окремо. Це часто означає написання одного або декількох невеликих додатків-оболонок, мета створення яких - відпрацювати один з модулів вашого застосування. Ваше завдання - виявити всі можливі помилки, так як повідомлення про внутрішні помилки програми, допустимі в тестових версіях, неприпустимі в комерційних. Повідомлення про помилки під час роботи комерційної версії додатка еквівалентні повідомленням, наведеним на рис. 2.4

Мал. 2.4.Про що думають користувачі, коли ваша програма виводить повідомлення про помилку? ..

Ну, і нарешті, філософське зауваження про слідство із закону Мерфі для програмування "У будь-якій працюючій програмі є хоча б одна помилка, при виправленні якої вноситься, по крайней мере, ще дві помилки". Навіть в найкращих комерційних програмах містяться помилки, а тому питання про знаходження і виправлення всіх помилок не може навіть бути поставлений. Але слід зробити все можливе, щоб виявити і ліквідувати якомога більше помилок. Наступний розділ цієї глави присвячений опису інструментів Delphi для локалізації та виправлення помилок.

Інтегрований відладчик Delphi

Давним-давно, коли комп'ютери були великими, а саме - років двадцять тому, налагодження полягала в копанні в величезних стосах паперу з вихідними текстами і роздруківках результатів роботи і споживанні неймовірної кількості кофеїну, а часто і анальгіну ... Сучасний програміст, особливо якщо він програмує на Delphi, більше не чорнороб від програмування з міцними від перевертання центнерів паперу м'язами, а "білий комірець", оточений різноманітними '' електронними мухобійку ", наданими Delphi.
 Інтегрований відладчик Delphi переповнений корисними, не надто корисними і зовсім марними можливостями, і здається, що вивчити їх просто неможливо. Однак використання відладчика Delphi просто, як апельсин: адже коли ви компілюєте свою програму і запускаєте її з середовища Delphi, ви вже користуєтеся вбудованим отладчиком, хоча, ймовірно, і не підозрюєте про це. Як завжди, 90% проблем вирішується 10% можливостей програмного забезпечення, а тому все розмаїття роботи з отладчиком ви можете вивчити пізніше, при вирішенні решти 10% ваших проблем.

Налаштування IDE для налагодження
 Для роботи з вбудованим отладчиком Delphi 4 його інтегроване середовище розробки (IDE) пропонує цілу серію установок, більшість з яких вам краще не чіпати, а залишити, як є (за замовчуванням). Однак якщо ви все-таки вирішили змінити установки, виберіть команду Tools / Options і в діалоговому вікні Environment Options клацніть на вкладці Preferences (вона показана на рис 2.5)
 Нижче перераховані опції вкладки Preferences і їх функції.

  • Integrated Debugging. Дозволяє вмикати та вимикати вбудований відладчик. Якщо вимкнути відладчик, налагоджувальні команди в меню Run стануть недоступними.

Порада:Якщо у вас виникли проблеми під час запуску програми з інтегрованого середовища, можливо, це викликано конфліктом вбудованого відладчика з іншими додатками, запущеними в системі. Спробуйте відключити вбудований відладчик і, якщо це допоможе, будьте впевнені - проблема криється в одному з вже запущених в системі додатків. Кращим рішенням буде перезавантаження і подальший запуск тільки абсолютно необхідних додатків.

Мал. 2.5.Використання вкладки Preferences для настройки інтегрованого відладчика Delphi.

  • Step Program Block. Ця опція визначає, чи повинен відладчик зупинятися перед початком виконання основного блоку begin. . . end при трасуванні програми. Зазвичай ця опція відключена, і включати її має сенс при додаванні коду в основний блок програми або при налагодженні консольного застосування.
  • Hide Designers on Run. Коли ця опція включена, вікно Object Inspector і форми, які використовуються при розробці програми, перш ніж запускати програму на виконання закриваються. Відключення опції дозволяє запускати програму швидше, але ефект перекривається використовуваними незакритими ресурсами додатки. Втім, чи буде обрана ця опція, залежить від користувача.
  • Break on Exception. При включеній опції IDE завжди перехоплює виняткові ситуації і виводить вікно повідомлення, навіть якщо в програмі виняткова ситуація обробляється блоком try. . .except. Включення цієї опції спростить налагодження, так як виводяться повідомлення при цьому будуть більш інформативними, ніж повідомлення обробника, встановлені за замовчуванням (порівняйте рис. 2.6 і 2.7). Крім цього, IDE розміщує вікно редактора поверх інших і виділяє рядок, що викликала виняткову ситуацію.

Мал. 2.6. Повідомлення про виняткову ситуацію при включеній опції Break on Exception

Мал. 2.7.Повідомлення про виняткову ситуацію, що виводиться оброблювачем за замовчуванням

Порада: Звичайно, опція Break on Exception корисна, але може привести в розгубленість новачка в Delphi, особливо коли йдеться про виняткову ситуацію, яку повинен обробити блок try. . .except. Ви можете або відключити цю опцію, або запустити додаток не з середовища Delphi, щоб побачити його роботу очима кінцевого користувача.

Minimize on Run Опція згортає вікно IDE під час запуску програми Подібно опції Hide Designers on Run, її установка залежить виключно від особистих переваг програміста

На сторінці Display діалогового вікна Environment Options є ще одна установка-опція Visible Gutter. Вона включає або відключає відображення сірої вертикальної смуги, розташованої зліва від вікна редагування (рис. 2.8), на якій мнемонічними значками відображається отладочная інформація

Включення в код налагоджувальної інформації
 Перед початком налагодження слід переконатися, що в додаток включена отладочная інформація Delphi.
 Для компіляції проекту з налагоджування слід виконати команду Project / Options і в діалоговому вікні Project Options вибрати вкладку Compiler (рис. 2.9).

Мал. 2.8.Вікно редактора з налагоджувальними значками

Мал. 2.9Вкладка Compiler діалогового вікна Project Options

 Включення налагоджувальної інформації регулюється наступними установками

  • Debug Information. Опція контролює включення налагоджувальної інформації. При відключенні цієї опції ви не зможете трассіровать код або ставити крапки переривання в будь-якому модулі. Опція еквівалентна директивам компілятора $ D і $ DEBUGINFO
  • Local Symbols. Опція контролює включення інформації про локальних змінних, декларованих, наприклад, всередині функцій, процедур і розділу implementation. Навряд чи у вас виникне необхідність у відключенні цієї опції, тим більше що вона ігнорується при вимкненому попередньої опції. Еквівалентні директиви компілятора- $ L і $ LOCALSYMBOLS.
  • Symbol Info. Цю опцію можна цілком віднести до розряду налагоджувальних, так як її дія спрямована на броузер об'єктів, а не на вбудований відладчик. Якщо опція включена, броузер об'єктів зможе виводити інформацію для об'єктів, визначених у модулях Опція ігнорується при вимкнених попередніх двох опціях Еквівалентні директиви компілятора - $ Y і $ REFERENCEINFO

Зазвичай ви будете включати опції Debug Information і Local Symbols для покрокової трасування програми. Однак, як згадувалося раніше, ви можете відключити зневадження для деяких модулів (просто використовуйте відповідну директиву на початку модуля).

unit MyUnit;
 {$ D-}
 interface
 ...

Використання директиви $ D- автоматично відключає опції Local Symbols і Symbol Info, так що вам не треба відключати їх окремо.

Порада:Якщо ви поширюєте модулі Delphi у вигляді DCU-файлів (наприклад, VCL) і не поширюєте їх вихідних текстів подбайте про те, щоб в скомпільованих модулів не містилася отладочная інформація

покрокова налагодження
 Одна з найпоширеніших завдань налагодження - виконання програми крок за кроком, по одному рядку за раз для перевірки правильності виконання. При покроковому проходженні коду відладчик виводить вікно редагування з виконуваної програмою. Точка виконання, показує наступну виконувану рядок програми, представляється у вигляді зеленої стрілки, розташованої зліва від області початкового тексту в вікні редагування.
 Після успішної компіляції модуля на смузі налагоджувальної інформації кожен рядок коду, яка зробила свій внесок в модуль, буде відзначена маленьким, синім кружком. Якщо ж рядок не позначена, значить, тут попрацював оптимізатор. Оскільки для таких рядків виконується код не згенерований ці рядки не будуть позначені точкою виконання.
 Інтегроване середовище Delphi надає користувачеві кілька команд покрокової налагодження доступних в меню Run (рис 2.10)

рис 2.10Використовуйте меню Run для виконання команд налагодження

Нижче перераховані команди налагодження.

  • Run. Вибір цієї команди запускає додаток на виконання в звичайному режимі. Ви можете використовувати її як для запуску програми, так і для продовження його роботи після будь-якого переривання виконання (наприклад, по точці зупинки). Якщо включена опція Break on Exception, використовуйте команду для продовження роботи після отримання повідомлення про виняткову ситуацію
  • Step Over. Коли точка виконання знаходиться на рядку містить виклик процедури або функції, використовуйте цю команду для виконання рядки, включаючи дзвінки один крок, без проходження окремих рядків викликаються функцій. Точка виконання переміщається при виконанні на наступний рядок
  • Trace Into. На відміну від попередньої команди, ця опція відпрацює покрокову налагодження викликаються процедур і функцій. Іншими словами, якщо, наприклад, в рядку викликається якась процедура, то при виконанні цієї команди точка виконання перейде на перший рядок процедури. Однак якщо в рядку немає таких викликів, значить, останні дві команди ідентичні. Будьте обережні при покрокової трасуванні обробника події OnPaint. Оскільки при покрокової налагодженні вікно редактора розміщується поверх інших вікон, потрібно перерисовка вікна програми, для чого викликається обробник події OnPaint ... Ви потрапляєте в замкнене коло, точніше в нескінченний цикл викликів одного і того ж обробника. Проте, варто лише простежити, щоб вікна програми і властивості тексту не перекривалися, і проблема вирішиться сама собою.
  • Trace to Next Source Line. Іноді ваш код викликає інший код побічно, наприклад, при виконанні функції, яка запускає обробник події, або при виконанні функції Windows API, яка, в свою чергу, запускає функцію непрямого виклику. Оскільки такі виклики непрямі, відладчик не бачить виклику і не відстежує покрокового виконання таких викликів. Однак використання описуваної команди призводить до відстеження таких викликів і останову отладчика на першому рядку викликається таким чином функції або процедури.
  • I Run to Cursor. Найчастіше вам зовсім не хочеться в пошуках помилки, місце розташування якої з якоюсь точністю вам відомо, покроково добиратися до потрібного місця через сотні, а то й тисячі рядків коду. В такому випадку просто помістіть курсор на потрібну вам рядок програми у вікні редагування і використовуйте команду Run to Cursor. Ці дії еквівалентні тимчасовому приміщенню точки зупину в необхідну вам рядок програми, і після виконання попереднього рядку коду робота програми припиняється. Якщо ви намагаєтеся виконати програму до позиції курсору, який знаходиться в рядку, що не містить налагоджувальної інформації, ви отримаєте повідомлення про помилку, показане на рис. 2.11.

Мал. 2.11.Це повідомлення про те, що ви намагаєтеся зупинити виконання програма на рядку, що не містить налагоджувальної інформації.

  • Show Execution Point. Ця команда змушує середу розробки відкрити вікно редактора і показати виконувану в даний час рядок програми. Вона корисна у випадках, коли ви, наприклад, закрили або згорнули вікно редактора під час налагодження (зазвичай при нормальному стані вікна відладчик робить це автоматично).
  • Program Pause. Вибір цієї команди негайно зупиняє виконання програми. Вона особливо корисна при зациклення програми.
  • Program Reset. Якщо ви досить "наотлажівалісь" і хочете завершити роботу своєї програми або запустити її заново, використовуйте цю команду. Вона негайно припинить виконання програми і поверне вас в середу розробника.

Багато команд мають пов'язані з ними комбінації клавіш, наприклад

Перегляд значень змінних
 При покроковому проходженні програми в відладчик ви, безсумнівно, захочете дізнатися, що міститься в різних змінних. Для цього можете використовувати вікно перегляду змінних Watch List, яке надає можливість пасивно переглядати вміст однієї або декількох змінних, або діалогове вікно Evaluate / Modify, що дозволяє працювати тільки з однією змінною (в ньому можна не тільки переглянути, а й змінити її вміст).
 Для перегляду значення змінної використовуйте команду Run / AddWatch або встановіть покажчик миші на змінну у вікні редагування, клацніть правою кнопкою миші і виберіть з контекстного меню команду Add Watch at Cursor. Після цього з'явиться діалогове вікно Watch Properties, показане на рис. 2.12. Введіть ім'я змінної в поле Expression (якщо воно не з'явилося там автоматично). Зверніть увагу на те, що ви можете переглядати значення не тільки змінних, але і виразів типу х * (y + z). Єдине обмеження-вираз не може містити викликів функцій, оскільки це може викликати побічний ефект, пов'язаний з незапланованим викликом функції, описаний вище, в підрозділі '' Використання директиви Assert ". Допускається також перегляд значень записів, масивів та інших структурованих елементів.
 Поле Repeat Count використовується в тому випадку, якщо у вас є великий масив, і ви хочете переглянути його частина. Припустимо, що вам треба знати значення елементів 826-833 наступного масиву

var
 BigArray: array [1..1000] of Integer;

Ви не можете переглянути масив BigArray, так як 1 000 елементів просто не помістяться в вікні (та й перегорнути непотрібні вам 825 елементів - работенка чимала!) Замість цього ви просите показати вам значення BigArray [826] і встановлюєте параметр Repeat Count рівним 8. При це вам будуть показані значення восьми елементів массіва- від 826 по 833.
 Використання поля Digits дозволяє визначити кількість значущих цифр при виведенні числа з плаваючою крапкою.
 Відключена опція Enabled запобігає виводу значення змінної, однак, середа буде зберігати всі параметри, задані для її перегляду. Так, ви можете тимчасово прибрати з екрану інформацію про змінну, яка в даний момент вам не потрібна, і швидко відновити її на екрані при необхідності без повторного введення характеристик перегляду.
 У діалоговому вікні є також набір перемикачів для вибору способу подання змінної. Значення Default дозволяє середовищі розібратися з типом змінної самостійно. Як правило, таке рішення оптимально, проте в будь-який момент ви можете уявити змінну як змінну того типу, який вас цікавить. Опція Memory dump представляє інформацію як набір байтів, що буває корисно, коли необхідно побачити внутрішнє подання інформації в змінної.
 На рис 2.13 відображені значення декількох змінних у вікні Watch List. Крім того, в деяких випадках відладчик виводить інформацію про причини, за якими вміст змінної недоступно.

Мал. 2.12.Використання діалогового вікна Watch Properties для додавання або зміни набору змінних у вікні перегляду.

Мал. 2.13.Перегляд змінних.

Сенс наведених повідомлень пояснюється нижче

  • Variable 'X' inaccessible here due to optimization (Змінна 'X' недоступна через оптимізацію). У цій точці значення змінної переглянути неможливо (іноді це можна зробити в іншому місці програми), так як для неї не виділена пам'ять через оптимізацію програми компілятором.
  • Symbol was eliminated by linker (Змінна видалена компоновщиком). Мінлива видалена з коду програми компоновщиком, так як на неї немає жодного посилання в тексті програми.

Отладчик також виводить повідомлення про помилку, якщо ім'я змінної написано неправильно, наприклад ви запросили значення Foo [5], в той час як змінна Foo масивом не є.

Порада:Коли ви намагаєтеся переглянути властивості об'єкта, що виводяться значення можуть виявитися марними. Багато властивостей об'єктів, що виглядають як змінні, насправді є викликами функцій. Отладчик не викликає функції для визначення значень, а тому коректні значення при такому перегляді ви отримати не можете. Вихід - в оголошенні нових змінних, присвоєння їм значень властивостей і перегляді не властивостей, а нових змінних. Неприємності можуть початися через занадто розумного оптимізатора, який зрозуміє, що, раз в програмі значення змінної більше не використовується, її можна викинути без шкоди для програми (на жаль, але не для налагодження програми!) Якщо це відбувається, використовуйте глобальні змінні, т . Е. змінні, оголошені поза функції або процедури. Отладчик завжди коректно відображає значення глобальних змінних.

Діалогове вікно Evaluate / Modify
 Для виведення діалогового вікна Evaluate / Modify виберіть команду Run / Evaluate / Modify (рис 2.14). Інший спосіб виклику діалогового вікна - встановити курсор в вікні редагування на необхідної вам змінної, натиснути правою кнопкою миші і в контекстному меню вибрати команду Evaluate / Modify.
 Введіть вираз в поле Expression так само, як в діалоговому вікні Watch Properties (див рис 2.12). Потім клацніть на кнопці Evaluate для того, щоб побачити результат в поле Result. Якщо вираз складається тільки з імені простий змінної (НЕ масиву або структури!), Можете ввести нове значення для змінної в поле New Value і, клацнувши на кнопці Modify, привласнити змінній нового значення. Це дозволяє коригувати значення змінних в процесі налагодження, не зупиняючись і не перекомпіліруя всю програму, що збереже ваш час і нерви, і дасть можливість, знайшовши одну помилку, шукати інші, а виправленням першої помилки зайнятися трохи пізніше.

рис 2.14Використання діалогового вікна Evaluate / Modify для перевірки зміни окремої змінної.

Діалогове вікно Evaluate / Modify - немодального, т. Е. Ви можете не закривати його, продовжуючи налагодження. Однак майте на увазі, що на відміну від вікна Watch List діалогове вікно Evaluate / Modify не відслідковує зміни значень змінних і для отримання інформації про поточний стан змінної вам необхідно скористатися кнопкою Evaluate.
 Так само, як і вікно Watch List, діалогове вікно Evaluate / Modify може виводити повідомлення про помилки, якщо відладчик не в змозі вивести інформацію про змінних. І точно так само не виводиться інформація про вирази, що містять виклик функцій.
 Як бачите, вікно Watch List і діалогове вікно Evaluate / Modify дуже схожі, але кожне з них має свої переваги в різних ситуаціях. Зверніть увагу на одну істотну відмінність діалогового вікна Evaluate / Modify його висновок виконується в поле з кількома рядками, а тому воно більш зручно для перегляду структур і об'єктів.

Установка точок зупину
 Точка зупинки (breakpoint) - своєрідний знак STOP для відладчика (на смузі зліва у вікні редактора вона і виглядає як маленький червоний значок). Коли ваше додаток запущено під отладчиком і доходить до рядка, в якій знаходиться точка зупинки, воно припиняє роботу і чекає ваших подальших розпоряджень. Такі точки можуть бути умовними і безумовними. Отладчик завжди зупиняється на точці безумовного зупинки і може зупинятися в точці умовного зупинки, коли виконана умова. Інтегрований відладчик Delphi підтримує два типи умов - логічне і за кількістю проходів. Нижче розглянуті обидва типи.
 Встановити точки зупину за допомогою таких дій:

  • Помістіть курсор редагування на обрану рядок програми і натисніть клавішу команди Toggle Breakpoint (за замовчуванням це клавіша ) для установки або видалення точки зупину в цьому рядку. Те ж саме можна виконати і за допомогою контекстного меню.
  • Виберіть команду Run / Add Breakpoint, і відкриється діалогове вікно Edit breakpoint (рис 2.15). Для установки найпростішої точки зупину просто клацніть на кнопці New. Ви також можете використовувати поля Filename і Line Number для установки точок зупину в іншому файлі або рядку за межами поточної позиції курсора. Поля Condition і Pass count використовуються для установки точки умовного зупинки.

Після установки однієї або декількох точок зупину можете використовувати вікно Breakpoint List для управління ними. Для виклику вікна Breakpoint List виберіть команду View / Breakpoints (рис. 2.16). У цьому вікні можете клацнути на рядку конкретної точки правою кнопкою миші і в контекстному меню відключити точку зупину за допомогою команди Disable (знову включити точку зупину можна за допомогою команди Enable) або видалити її за допомогою команди Delete. Команди View Source і Edit Source активізують вікно з поточним файлом вихідного тексту, при цьому команда Edit Source встановлює курсор в рядок з точкою зупинки. Команда Properties виводить діалогове вікно Edit breakpoint, показане на рис. 2.15, дозволяючи тим самим змінювати параметри точки зупину.

Мал. 2.15.Використання діалогового вікна Edit breakpoint для установки нової точки зупину.

Мал. 2.16. Використання вікна Breakpoint list для управління точками зупинки.

 Після клацання правою кнопкою миші у вікні при невибраною точці зупинки виводиться контекстне меню, в якому команда Add служить для додавання нової точки, Delete All видаляє всі точки зупинки, а команди Disable All і Enable All відключають або включають всі точки зупинки в списку.
 Для перетворення безумовної точки зупину в умовну, необхідно викликати діалогове вікно Edit breakpoint (див. Рис. 2.15) і ввести умовне вираз або кількість проходів до відповідних поля.
 Умовний вираз, введене в поле Condition, може бути будь-яким логічним виразом. Після досягнення точки зупину відладчик обчислює значення виразу і, якщо результат помилковий, продовжує виконання програми. Якщо вираз істинний, виконання програми призупиняється. Як завжди, вираз не повинно використовувати виклик функції. Такі точки зупину корисні, якщо ви можете потрапити в Вас фрагмент коду різними шляхами, але ви хочете зупинити виконання програми тільки при досягненні будь-яких конкретних умов.
 Нульове значення, введене в поле Pass count, дає отладчику завдання продовжувати виконання програми при проходженні через точку зупину, поки через неї не буде виконано відповідну кількість проходів. При кожному проході через точку зупину відладчик зменшує значення лічильника на одиницю і після досягнення нульового значення програма призупиняється. Такий метод корисний при роботі з циклами, особливо якщо ви знаєте, що помилка відбувається після певної кількості циклів.
 Зараз, коли ви вивчили основи технології налагодження, ймовірно, у вас виникло бажання поставити крапку зупинки у себе в голові і попрацювати з точками зупинки в програмах. До речі, один з відмінних методів зрозуміти, як працює та чи інша програма, - простежити за її покроковим виконанням, а оскільки ні установка точок зупину, ні перегляд або зміна змінних не змінюють тексту програми, ви можете працювати сміливо, не боячись будь-яким чином "поламати" використовується в навчальних цілях додаток.

налагодження DLL
 У попередніх версіях Delphi для налагодження бібліотек динамічного компонування був потрібний зовнішній відладчик (Turbo Debugger for Windows). Delphi 4 внесла можливість налагодження DLL в список своїх можливостей. Windows не може завантажити DLL без попереднього завантаження використовує її ЕХЕ, тому вам з початок доведеться накидати простеньку програмку, яка використовує інформацію, що цікавить вас DLL. У головному меню виберіть команду Run / Parameters для виведення діалогового вікна Run Parameters. Якщо поточний проект- DLL (DPR-файл починається ключовим словом library, а не program), поле Host Application буде доступно, і в ньому вам треба або ввести ім'я використовує DLL програми, або вибрати його за допомогою кнопки Browse.
 Після вибору програми запуск і налагодження DLL стають звичайною рутинною роботою з усіма можливостями, використовуваними при налагодженні програм, - установкою точок зупину, переглядом значень змінних і т.д.
 Точно так же ви будете налагоджувати і свої компоненти ActiveX, і об'єкти автоматизації OLE.

Вікно CPU (дизассемблер)
 Вікно CPU надає можливість побачити роботу програми на рівні мови асемблера. Ті, хто використовували відладчик Turbo Debugger for Windows, повинні знати можливості, що надаються таким вікном. Ефективне його використання передбачає знання асемблера Intel x86 і архітектури процесора, так що, якщо ви не цілком впевнено себе почуваєте, можете пропустити цей розділ.
 Вікно CPU потрібно вкрай рідко, але якщо в ньому виникла необхідність, значить, це дійсно необхідність. Це - ultima ratio, останній аргумент, і використовується він в безвихідних положеннях, коли звичайна трасування коду не дозволяє знайти, зрозуміти і виправити помилки. Тільки в таких випадках вікно CPU і прохід по асемблерним інструкцій може підняти завісу над причиною виникнення помилок.
 Щоб використовувати вікно CPU необхідно його включити (за замовчуванням воно відключено). Для цього доведеться використовувати програму RegEdit з поставки Windows 95 (Windows NT). Запустіть RegEdit і пробирайтеся за ієрархічним дереву папок. Спочатку відкрийте папку HKEY_CURRENT_USER. У вкладеної гілки зайдіть в папку Software, потім - в Borland, Delphi і, нарешті, в 4.
 Одна з папок називається Debugging. Клацніть на ній і, коли вона відкриється, з'явиться список пар Ім'я / Дані в віконці справа. Додайте нове значення з ім'ям EnableCPU і значенням 1.
 Під час наступного запуску Delphi ви побачите новий підпункт меню View / CPU Window.
 Для виведення вікна виберіть View / CPU Window.

Перерахуємо панелі

  • Code pane Панель коду являє дизасемблювати код в околиці поточної точки виконання (якщо ви не налагоджувати додаток, вікно буде напівпорожнім). Крім того, панель показує вихідний текст рядків, відповідних виконуваного коду. У вікні редагування точка виконання відображається маленьким зеленим значком. При покроковому проході значок точки виконання синхронно переміщується по вікну CPU і вікна редагування.
  • Register pane. В панелі регістрів відображається вміст 16 регістрів процесора. Значення регістрів, що змінилися в результаті виконання останньої операції, виділені червоним кольором.
  • Flags pane. Панель прапорів показує стан 14 прапорів процесора. Встановлений прапор представляється значенням 1, скинутий прапор значенням 0. Залежно від процесора деякі прапори можуть бути недоступними.
  • Stack pane. Панель стека показує вміст стека додатки. Ви можете змінювати уявлення вмісту стека за допомогою контекстного меню.
  • Data pane. За замовчуванням в панелі даних виводиться вміст глобального сегмента даних програми. Її вигляд можна змінити так само, як і вид панелі стека.

Кожна з панелей у вікні CPU має власне контекстне меню. Ви можете поекспериментувати з пунктами меню і отримати більш повне уявлення про можливості маніпулювання панелями.

Вікно стану підзадач.
 Вікна Thread Status, Modules і Call Stack надають додаткову інформацію, яка може бути корисна при налагодженні програми.
 У вікні Thread Status перераховані всі активні підзадачі з поточною діяльністю. Для перегляду стану підзадач виберіть команду View / Threads, і на екрані з'явиться вікно Thread Status (рис 2.17).

Рис 2.17.Використання вікна Thread Status для перегляду атрибутів підзадач в додатку

У чотирьох колонках вікна представлена ??наступна інформація:

  • Thread ID. Унікальний ідентифікатор підзадачі, присвоєний їй операційною системою.
  • State. Стан підзадачі, зазвичай - Running або Stopped. Якщо ваш додаток запущено, але очікує введення від користувача, стан виводиться як Runnable.
  • Status. Статус підзадачі може мати одне з чотирьох значень. Breakpoint означає, що потік зупинений в точці зупинки. Stepped- подзадача знаходиться в режимі покрокового виконання. Faulted- зупинка підзадачі через виняткової ситуації та Unknown - статус невідомий.
  • Location. У цій колонці виводиться рядок вихідного коду, відповідного поточної точці виконання підзадачі. Якщо відладчик не в змозі визначити рядок вихідного тексту, виводиться 32-бітову адресу точки виконання.

Якщо вами розроблено додаток з кількома подзадачами, і ви хочете налагодити одну з підзадач, можете вільно за допомогою вікна Thread Status. Виберіть підзадачу, якою ви хочете зробити поточної, і клацніть на ній правою кнопкою миші. Виберіть з контекстного меню команду Make Current. При цьому фокус виконання буде переданий обраної подзадаче, і ви зможете налагоджувати її як основну задачу.
 У контекстному меню вікна містяться дві команди - View Source і Go to Source. Вони можуть стати в нагоді для того, щоб простежити за точкою виконання іншої підзадачі без передачі їй фокуса.

вікно Modules
 У вікні Modules відображаються всі моделі (ЕХЕ-файл вашого застосування і всі використовувані динамічні бібліотеки), які розташовуються в адресному просторі додатки. У нього входять безпосередньо підключені DLL і бібліотеки, підключення через інші бібліотеки, а також бібліотеки, завантажені операційною системою. Щоб побачити це вікно, зображене на рис 2.18. виберіть команду View / Modules. У вікні інформація виводиться в трьох стовпчиках Name (ім'я модуля), Address (адреса початку коду модуля) і Path (повний шлях каталогу, з якого був завантажений модуль). Інформація про каталог може бути важлива, якщо можливе завантаження модуля не з того каталогу, з якого очікувалася, наприклад, в старішої версії. Інформація про адресу зазвичай використовується при налагодженні в вікні CPU.

Вікно Call Stack
 У цьому вікні представлений список всіх функцій і процедур, викликаних до моменту досягнення точки виконання і робота яких припинена. Для відкриття цього вікна, показаного на рис 2.19, використовуйте команду View / Call Stack.

Мал. 2.18.Використання вікна Modules для виведення списку модулів, використовуваних додатком.

Мал. 2.19 Використання вікна Call Stack для визначення всіх викликаних функцій і процедур.

 У верхньому рядку вікна виводиться ім'я поточної процедури (DontHitMe в наведеному прикладі). У наступному рядку вказується ім'я процедури, що викликала дану процедуру (Ouch) і т.д. Це вікно може бути дуже корисним, коли треба визначити, яким шляхом ви досягли точки зупину. Додаткові можливості надає контекстне меню вікна, яке можна викликати, клацнувши правою кнопкою миші.

Трасування вихідного коду VCL
 Якщо ви використовуєте відповідну версію поставки Delphi 4, значить, в неї входять вихідні тексти VCL (Visi Component Library). В поставку VCL входять скомпільованими без налагоджувальної інформації, що означає, що при налагодженні ви не зможете пройти код покроково. Немає особливої ??необхідності трассіровать код VCL, але якщо ви хочете переконатися, що помилка не в VCL, або подивитися, як працює функція, доведеться перекомпілювати модулі, які потрібно трассіровать, налагоджування.

Порада: Деякі стандартні модулі VCL вимагають компіляції з відключеною опцією Overflow Checking для коректної роботи. Тому при повторному збиранню переконайтеся, що ця опція компілятора відключена.



загрузка...
© um.co.ua - учбові матеріали та реферати