21 день - налагоджувач Perl
- Вхід до налагоджувача
- Вихід із налагоджувача
- Команда l
- Команда
- Команда w
- Кінець ?? Команди
- Команда S
- Команда s
- Російське командування
- Команда f
- Команда повернення вагона
- R командування
- Команда X
- V командування
- Команда b
- C командування
- Команда L та точки прориву
- Команди d і D
- Команда
- Команда А
- Команди <і>
- Відображення лінійних дій за допомогою команди L
- Виконання інших заяв Perl
- Команда H: Перелік попередніх команд
- The! Команда: виконання попередніх команд
- Команда T: Відстеження стека
- Команда p: Друк виразу
- Команда = Визначення псевдонімів
- Визначення псевдонімів
- H Команда: Довідка з налагодження
- Вікторина
Сьогоднішній урок описує засіб налагодження Perl. Ви дізнаєтесь наступне:
- Як увійти та вийти з налагоджувача Perl
- Як перелічити частини вашої програми
- Як виконати одну заяву за раз
- Як встановити точки перерви та простежити виконання програми
- Як виконувати дії лінії
- Про інші корисні команди налагодження
У наступних розділах описано, як запустити налагоджувач Perl та як вийти.
Вхід до налагоджувача
Щоб налагодити програму Perl, вкажіть параметр -d під час запуску програми. Наприклад, для налагодження програми під назвою debugtest вкажіть таку команду:
$ perl -d налагодження
Ви можете надати інші варіанти разом з -d, якщо ви хочете.
Коли інтерпретатор Perl бачить опцію -d, він запускає налагоджувач Perl. Відладчик починається з відображення на екрані повідомлення, подібного до наступного:
Завантаження процедур БД з $ RCSfile: perldb.pl, v $$ Версія: 4.0.1.3 $$ Дата: 92/06/08 13:43:57 $ Підтримка Emacs доступна. Введіть h для довідки. головний: :( налагодження: 3): $ dircount = 0; БД <1>
Перші кілька рядків відображають дату створення цієї версії налагоджувача. Єдиними напрямками інтересів є останні два.
У другому останньому рядку на цьому дисплеї відображається рядок, який відладчик збирається виконати. Коли запускається відладчик, відображається перший виконуваний рядок програми.
Коли налагоджувач відображає рядок, який він збирається виконати, він також надає таку інформацію про рядок:
- Пакет, у якому міститься рядок (у цьому випадку пакет за замовчуванням, який є основним)
- Ім'я файлу, що містить рядок (тут файл називається налагодженням)
- Поточний номер рядка (який у цьому прикладі дорівнює 3)
Останній рядок дисплея запрошує команду налагодження. Число, включене в кутові дужки, вказує номер команди; у цьому випадку число дорівнює 1, оскільки ви збираєтесь вказати першу команду налагодження.
Пізніше сьогодні ви дізнаєтесь, як використовувати номер команди налагодження для повторного введення команд налагодження, які ви раніше виконували.
Щоб увійти до налагоджувача без подачі програми, надайте опцію -e опцією -d: $ perl -d -e "1;" Цей рядок запускає налагоджувач з "програми", що складається з одного твердження 1; (це вираз, який не робить нічого значимого). Запуск налагоджувача без програми дозволяє вивчити заздалегідь задані змінні системи або оператори пропозиції, які потрібно виконати. Ви дізнаєтесь, як виконати обидва ці завдання пізніше на сьогоднішньому уроці
Вихід із налагоджувача
Щоб вийти з налагоджувача, введіть команду налагодження q:
БД <1> q
Ця команда негайно зупиняє виконання програми та повертає вас до командної оболонки.
Ви можете перелічити будь-яку частину програми в межах налагоджувача. У наступних розділах описані команди налагодження, які виконують операції з відображенням.
Команда l
Найпростіший спосіб перерахувати частину вашої програми - це команда l, в якій перераховано наступні декілька операторів вашої програми:
DB <1> l 3: $ dircount = 0; 4: $ curdir = ""; 5: while (1) {6: # якщо у нас немає поточного каталогу, отримайте 7: if ($ curdir eq "") {8: print ("Введіть каталог у список: \ n"); 9: $ curdir = <STDIN>; 10: $ curdir = ~ s / ^ \ s + | \ s + $ // g; 11: $ curdir = & followlink ($ curdir); 12: & readsubdirs ($ curdir);
Команда l перелічує вікно виконуваних операторів, що представляє собою групу операторів, достатньо малу, щоб легко відображатися на екрані. Вікно зазвичай складається з приблизно десяти висловлювань. Номер рядка кожного твердження відображається на початку його рядка.
ПРИМІТКА
Висловлювання, що відображаються на сьогоднішньому уроці, взяті з програми, представленої у "2 тижні в огляді".
Повторне введення команди l відображає вікно висловлювань відразу після останнього відображеного рядка, у цьому прикладі - рядок 12:
DB <1> l 13:} 14: $ curdir = & menudir ($ curdir); 15:} 16: 17: 18: # Знайдіть усі підкаталоги даного каталогу, 19: # та збережіть їх у асоціативному масиві. 20: # 21: # Підписки та значення асоціативного масиву: 22: # <ім'я каталогу>: 1
Ви можете вказати рядки, відображені командою l. Якщо ви вкажете номер одного рядка за допомогою команди l, він відображатиме цей рядок:
DB <1> l 10 10: $ curdir = ~ s / ^ \ s + | \ s + $ // g;
Щоб відобразити діапазон рядків, вкажіть номер першого та останнього рядка та розділіть їх дефісом:
DB <1> l 10-15 10: $ curdir = ~ s / ^ \ s + | \ s + $ // g; 11: $ curdir = & followlink ($ curdir); 12: & readsubdirs ($ curdir); 13:} 14: $ curdir = & menudir ($ curdir); 15:}
Щоб відобразити задану кількість рядків, починаючи з певної точки, введіть номер початкової лінії, символ + та ряд додаткових рядків для відображення:
DB <1> l 10 + 5 10: $ curdir = ~ s / ^ \ s + | \ s + $ // g; 11: $ curdir = & followlink ($ curdir); 12: & readsubdirs ($ curdir); 13:} 14: $ curdir = & menudir ($ curdir); 15:}
Ви також можете скористатися командою l, щоб вказати підпрограму для відображення. Для цього введіть назву підпрограми для відображення:
DB <1> l readsubdir 26: sub readsubdir {27: local ($ dirname) = @_; 28: локальний ($ dirvar, $ subdircount, $ name, $ index); 29: 30: # відкрити поточний каталог; 31: # $ dircount гарантує, що кожна змінна файлу є унікальною 32: $ dirvar = "DIR". ++ $ dircount; 33: if (! Opendir ($ dirvar, $ dirname)) {34: warn ("Неможливо відкрити $ dirname \ n"); 35: повернення;
Ця команда перераховує оператори у підпрограмі. Якщо підпрограма занадто велика, щоб вміститися в одному вікні, перераховано лише перші кілька заяв; Ви можете перелічити наступні твердження, ввівши l без аргументів.
Команда
Ви можете відобразити рядки безпосередньо перед останнім відображеним рядком, ввівши команду -. Наприклад, наступна команда перелічує вікно рядків, що безпосередньо передує читанню підпрограми підпрограми.
БД <1> - 16: 17: 18: # Знайдіть усі підкаталоги даного каталогу, 19: # та збережіть їх у асоціативному масиві. 20: # 21: # Підписки та значення асоціативного масиву: 22: # <ім'я каталогу>: 1 23: # (вказує, що каталог було прочитано) 24: # <ім'я каталогу>. <Num> the <num> th підкаталог 25:
Наступні - команди повертаються далі у файл.
Команда w
Щоб перерахувати вікно рядків, що містять вказаний рядок, скористайтеся командою w та вкажіть номер рядка, який слід включити:
БД <1> w 7 4: $ curdir = ""; 5: while (1) {6: # якщо у нас немає поточного каталогу, отримайте 7: if ($ curdir eq "") {8: print ("Введіть каталог у список: \ n"); 9: $ curdir = <STDIN>; 10: $ curdir = ~ s / ^ \ s + | \ s + $ // g; 11: $ curdir = & followlink ($ curdir); 12: & readsubdirs ($ curdir); 13:}
Команда w відображає три рядки перед вказаним рядком і заповнює вікно рядками, що слідують за ним.
Кінець ?? Команди
Ви можете шукати рядок, що містить певний візерунок, додавши шаблон у косої риси:
DB <1> / Find / 18: # Знайти всі підкаталоги даного каталогу,
Відладчик шукає вперед з останнього відображеного рядка рядок, що відповідає заданому шаблону. Якщо він знайде таку лінію, відображається рядок.
Щоб шукати певний зразок назад, додайте шаблон до знаків запитань:
DB <1>? Readsubdir? 12: & readsubdirs ($ curdir);
Ця команда починається з останнього відображеного рядка і шукає назад, поки не знайде рядок, що відповідає заданому шаблону.
Шаблони, задані // і ?? може містити будь-який спеціальний символ, зрозумілий перекладачем Perl. Ви необов'язково можете пропустити фінал / або? символу, коли ви співпадаєте з візерунком.
Команда S
Команда S перераховує всі підпрограми в поточному файлі, по одній підпрограмі на рядок:
DB <> S main :: display main :: followlink main :: menudir main :: readsubdirs
Кожному імені підпрограми передує ім'я пакету та одна лапка.
Однією з найкорисніших функцій налагоджувача Perl є можливість виконання програми один за одним. У наступних розділах описано твердження, які здійснюють цю дію.
Команда s
Для виконання одного оператора вашої програми використовуйте команду s:
DB <2> s main: :( налагодження: 4): $ curdir = "";
Ця команда виконує один оператор вашої програми, а потім відображає наступне, яке слід виконати. Якщо виконаний оператор потрібно прочитати зі стандартного вхідного файлу, відладчик чекає, поки введено введення, перш ніж відобразити наступний рядок для виконання.
Порада
Якщо ви забули, який рядок є наступним рядком для виконання (оскільки, наприклад, ви показали рядки за допомогою команди l), ви можете перерахувати наступний рядок, який потрібно виконати за допомогою команди L: DB <2> L 3: $ dircount = 0; Команда L перераховує останні рядки, виконані програмою. Тут також перераховані будь-які точки перерви та дії лінії, визначені для певних ліній. Точки перериву та дії лінії обговорюються пізніше сьогодні.
Якщо оператор, виконаний командою s, викликає підпрограму, відладчик Perl вводить підпрограму, але не виконує жодних операцій у ній. Натомість він зупиняється на першому виконуваному операторі у підпрограмі та відображає його. Наприклад, якщо поточний рядок є наступним:
main: :( налагодження: 12): & readsubdirs ($ curdir);
Вказуючи команду s, вказує налагоджувач Perl ввести readsubdir і відображати наступне, що є першим виконуваним рядком readsubdir:
main :: readsubdirs (debugtest: 27): local ($ dirname) = @_;
Команда s передбачає, що ви хочете налагодити введену підпрограму. Якщо ви знаєте, що певна підпрограма працює належним чином, і ви не хочете переходити через неї по одному оператору, використовуйте команду n, описану в наступному розділі.
Російське командування
Команда n, як і команда s, виконує один рядок вашої програми та відображає наступний рядок, який потрібно виконати:
DB <2> n main: :( налагодження: 5): while (1) {
Однак російське твердження не вводить жодної підпрограми. Якщо оператор, виконаний n, містить виклик підпрограми, підпрограма виконується в повному обсязі. Після виконання підпрограми налагоджувач відображає рядок відразу після виклику.
Наприклад, якщо поточний рядок є
main: :( налагодження: 12): & readsubdirs ($ curdir);
n команда повідомляє налагоджувачу виконувати readsubdir і потім відображати наступний рядок у програмі, який є
головний: :( налагодження: 13 :):}
Поєднання використання s і n гарантує, що налагоджувач вивчає лише підпрограми, які ви хочете бачити.
Налагоджувач Perl не дозволяє вводити будь-які функції бібліотеки. Ви можете вводити лише підпрограми, які ви створили самостійно або які були створені раніше та додані до бібліотеки підпрограм
Команда f
Команда f повідомляє відладчику Perl виконати залишок висловлювань у поточній підпрограмі, а потім відобразити рядок відразу після виклику підпрограми. Це корисно, коли ви шукаєте помилку та визначили, що поточна підпрограма не містить проблеми.
Команда повернення вагона
Якщо ви переходите через програму за допомогою s або n, ви можете зберегти собі певний текст, просто натиснувши Enter, коли ви хочете виконати інший оператор. Коли ви натискаєте Enter, відладчик повторює останню виконану команду s або n.
Наприклад, щоб перейти з рядка 5 до рядка 7, ви можете використовувати команду s як завжди:
DB <3> s main: :( налагодження: 7): if ($ curdir eq "") {
(Рядок 6 пропускається, оскільки не містить виконуваних операторів.) Щоб виконати рядок 7, тепер можна просто натиснути Enter:
DB <2> main: :( налагодження: 8): print ("Введіть каталог у список: \ n");
ПРИМІТКА Натискання клавіші Enter не впливає, якщо ви не вказали жодних s або n команд.
R командування
Якщо ви перебуваєте всередині підпрограми і вирішите, що вам більше не потрібно переступати через неї, ви можете сказати налагоджувачу Perl закінчити виконання підпрограми та повернутися до оператора після виклику підпрограми. Для цього використовуйте команду r:
DB <4> r main: :( налагодження: 13 :):}
Оператор, який відображається налагоджувачем, є першим оператором після виклику підпрограми.
Ще одна потужна особливість налагоджувача Perl - можливість відображення значення будь-якої змінної в будь-який час. У наступних розділах описані команди, які виконують цю дію.
Команда X
Команда X відображає змінні в поточному пакеті (що є основним, якщо не вказано жодного іншого пакета). Якщо команда X задана сама собою, вона містить список усіх змінних у поточному пакеті, включаючи визначені системою змінні та змінні, які використовує сам інтерпретатор Perl. Зазвичай ви не хочете використовувати команду X сама по собі, оскільки інтерпретатору Perl відомо багато системно визначених та внутрішніх змінних.
Щоб надрукувати значення певної змінної чи змінних, вкажіть ім’я або імена змінної за допомогою команди X:
DB <5> X dircount $ dircount = '0'
Ця можливість часто корисна, коли ви перевіряєте на наявність помилок у вашій програмі.
Ви можете використовувати X для відображення значень змінних масивів та змінних асоціативних масивів.
DB <6> X regarray @regarray = (0 14 1 'привіт' 2 36) DB <7> X assocarray% assoc_array = ('привіт' 1 'є' 2)
Кожна команда друкує підписи масиву та їх значення. Регулярні масиви друкуються в порядку підписки; асоціативні масиви друкуються в не конкретному порядку.
ПРИМІТКА
Якщо у вас є змінна масив і скалярна змінна з тим самим іменем, команда X друкує обидві змінні: DB <8> X var
$ var = '0'
@var = (
0 'test1'
1 'тест2'
) Немає можливості використовувати X для відображення однієї змінної, але не іншої.
V командування
Команда V ідентична команді X за винятком того, що вона друкує значення змінних у будь-якому пакеті. Якщо ви вказали лише ім'я пакету, як у наступному, ця команда відображає значення всіх змінних у пакеті (включаючи визначені системою та внутрішні змінні):
DB <9> V mypack
Якщо ви вказали ім'я пакета та одне чи більше імен змінних, як у наступному, налагоджувач виводить значення змінних (якщо вони визначені в цьому пакеті):
DB <10> V головний дирконт $ dircount = '0'
Як ви вже бачили, ви можете сказати налагоджувачу Perl виконувати по одній операції за один раз. Інший спосіб управління виконанням програми - повідомити налагоджувачу виконувати до певної заданої точки програми, що називається точкою розриву .
У наступних розділах описані команди, які створюють точки прориву, і команда, яка виконується, поки не буде виявлено точку розриву.
Команда b
Для встановлення точки перерви у вашій програмі скористайтеся командою b. Ця команда повідомляє налагоджувачу зупиняти виконання програми кожного разу, коли він збирається виконати вказаний рядок. Наприклад, наступна команда каже налагоджувачу зупинятися, коли він збирається виконати рядок 10:
БД <11> b 10
(Якщо рядок не є нерозривним, налагоджувач поверне рядок 10, не порушується.)
ПРИМІТКА
У вашій програмі може бути стільки точок перерви, скільки ви хочете. Відладчик зупинить виконання програми, якщо він збирається виконати будь-який з операторів, для яких була визначена точка зламу.
Команда b також приймає імена підпрограми:
БД <12> б меню
Це встановлює точку перерви в першому виконаному операторі меню підпрограми.
Ви можете скористатися командою b, щоб сказати програмі зупинятися лише тоді, коли вказана умова є справжньою. Наприклад, наступна команда каже налагоджувачу зупинитися, якщо він збирається виконати рядок 10, а змінна $ curdir дорівнює нульовій рядку:
БД <12> b 10 ($ curdir eq "")
Умовою, зазначеною в b-заяві, може бути будь-який законний умовний вираз Perl.
C командування
Після того, як ви встановите точку розриву, ви можете сказати налагоджувачу виконувати, поки він не досягне або точки розриву, або кінця програми. Для цього використовуйте команду c:
DB <13> c main: :( налагодження: 10): $ curdir = ~ s / ^ \ s + | \ s + $ // g; БД <14>
Коли налагоджувач виявить, що збирається виконати рядок 10 - рядок, на якому була встановлена точка розриву, вона зупиняється і відображає лінію. (Нагадаємо, що налагоджувач завжди відображає лінію, яку він збирається виконати.)
Відладчик тепер пропонує вам ще одну команду налагодження. Ця дія дає змогу почати виконувати один оператор одночасно за допомогою n або s, продовжувати виконання за допомогою c, встановлювати більше точок перерви за допомогою b або виконувати будь-яку іншу операцію налагодження.
Ви можете вказати тимчасову (одноразову) точку розриву за допомогою команди c, вказавши номер рядка:
DB <15> c 12 main: :( налагодження: 12): & readsubdirs ($ curdir);
Аргумент 12, що постачається з командою c, вказує налагоджувачу визначити тимчасову точку розриву в рядку 12 і потім відновити виконання. Коли відладчик досягає рядка 12, він зупиняє виконання, виводить лінію та видаляє точку розриву. (Звичайно, сама лінія все ще існує.)
Використання c для визначення тимчасової точки перерви корисно, якщо ви хочете пропустити кілька рядків, не витрачаючи часу на виконання програми одним заявою за часом. Використання c також означає, що вам не потрібно заважати визначати точку розриву за допомогою b та видаляти її за допомогою d (описано в наступному розділі).
Якщо ви маєте намір визначити точки прориву за допомогою c або b, добре переконатися, що кожен рядок вашої програми містить щонайменше одне твердження. Якщо ви звикли писати рядки, які містять більше одного твердження, наприклад, $ x ++; $ y ++; ви не отримаєте стільки користі від налагоджувача, оскільки він не може зупинитися посеред рядка
Команда L та точки прориву
Щоб перерахувати всі точки прориву, скористайтеся командою L. Ця команда перераховує кілька останніх виконаних рядків, поточний рядок, визначені вами точки переривання та умови, при яких пункти перерви набувають чинності.
DB <16> L 3: $ dircount = 0; 4: $ curdir = ""; 5: while (1) {7: if ($ curdir eq "") {10: $ curdir = ~ s / ^ \ s + | \ s + $ // g; перерва, якщо (1)
Тут програма виконала рядки 3-7, а точка рядка визначена для рядка 10. (Рядок 6 не вказаний, оскільки це коментар.) Ви можете відрізнити точки перерви від виконаних рядків, шукаючи умовний вираз точки перерви, який негайно слід за точкою розриву. Тут умовний вираз дорівнює (1), що вказує на те, що точка перерви завжди діє.
Команди d і D
Коли ви закінчите з точкою розриву, ви можете її видалити за допомогою команди d.
БД <16> d 10
Ця команда повідомляє налагоджувачу видалити точку зламу в рядку 10. Сама лінія залишається в програмі.
Якщо ви не вказали точку розриву для видалення, відладчик передбачає, що для наступного рядка, який буде виконуватися, визначається точка зламу та видаляє його.
main: :( налагодження: 12): & readsubdirs ($ curdir); ДБ <17> д
Тут рядок 12 є наступним рядком, який слід виконати, тому відладчик видаляє точку розриву в рядку 12.
Щоб видалити всі точки прориву, використовуйте команду D.
БД <18> D
Ця команда видаляє всі точки перелому, визначені вами командою b.
Коли ви запускаєте програму за допомогою налагоджувача Perl, ви можете сказати їй відображати кожен рядок у міру його виконання. Коли налагоджувач робить це, кажуть, що він знаходиться в режимі сліду .
Щоб увімкнути режим слідування, використовуйте команду T.
DB <18> t Trace = увімкнено
Коли оператор виконується в режимі відстеження, оператор відображається. Наприклад, якщо поточний рядок є рядком 5 і введена команда c 10 (яка виконує до рядка 10), відображається наступне:
DB <18> c 10 main: :( debugtest: 5): while (1) {main: :( debugtest: 7): if ($ curdir eq "") {main: :( debugtest: 10): $ curdir = ~ s / ^ \ s + | \ s + $ // g; БД <19>
Відладчик друкує та виконує рядок 5 та рядок 7, потім відображає рядок 10 та чекає подальших інструкцій.
Щоб вимкнути режим слідування, вкажіть команду t ще раз.
DB <19> t Trace = вимкнено
У цей момент режим слідування вимикається, поки не буде введена інша команда t.
Налагоджувач Perl дає змогу вказати одне або більше операторів, які потрібно виконати, коли програма досягає заданого рядка. Такі твердження відомі як дії рядка. Найпоширеніші дії рядка - це друк значення змінної та скидання змінної, що містить помилкове значення, до потрібного вам значення.
У наступних розділах описані команди налагодження, які визначають дії рядка.
Команда
Щоб вказати дію рядка для певного рядка, використовуйте команду.
DB <19> 10 друку ("curdir є $ curdir \ n");
Ця команда повідомляє налагоджувачу виконати оператор
print ("curdir є $ curdir \ n");
всякий раз, коли збирається виконати рядок 10 програми. Налагоджувач виконує дію відразу після того, як відобразить поточний рядок і перед тим, як запитати наступну команду налагодження.
Щоб створити дію рядка, що містить більше одного твердження, просто з'єднайте оператори разом. Якщо вам потрібно більше одного рядка для висловлювань, поставте зворотний проріз в кінці першого рядка.
DB <20> 10 друку ("curdir є $ curdir \ n"); print \ ("це довга дія рядка \ n");
У цьому випадку, коли налагоджувач доходить до рядка 10, він виконує такі операції:
print ("curdir є $ curdir \ n"); print ("це довга дія \ n");
Команда А
Щоб видалити дії рядка, визначені за допомогою команди, використовуйте команду A.
БД <21> А
Ця команда видаляє всі визначені в даний час дії рядка.
ПРИМІТКА
Команда A не впливає на команди <і>, описані в наступному розділі.
Команди <і>
Щоб визначити дію рядка, яка повинна бути виконана до того, як відладчик виконає будь-які подальші оператори, використовуйте команду>.
DB <21>> print ("curdir перед виконанням - $ curdir \ n");
Ця команда повідомляє налагоджувачу надрукувати значення $ curdir перед продовженням.
Аналогічно, команда <визначає дію рядка, яка повинна бути виконана після того, як відладчик закінчить виконання операцій і перед тим, як запитати ще одну команду налагодження:
DB <22> <print ("curdir після виконання - $ curdir \ n");
Ця команда повідомляє налагоджувачу надрукувати значення $ curdir перед тим, як знову зупинити виконання.
Команди <і> корисні, коли ви знаєте, що одна із змінних має неправильне значення, але ви не знаєте, якому оператору присвоєно змінне значення. Одноразово перейшовши через програму за допомогою s або n та роздрукувавши змінну до або після виконання кожного оператора, можна визначити, де змінній було надано її неправильне значення.
ПРИМІТКА
Щоб видалити дію рядка, визначену командою <, введіть іншу <команду, без дії рядка. БД <23> <Аналогічно, наступна команда скасовує ефекти команди> БД <24>>
Відображення лінійних дій за допомогою команди L
Команда L друкує будь-які дії рядка, визначені вами за допомогою команди (а також точки прориву та виконані рядки). Наприклад, припустимо, що ви визначили дію лінії за допомогою наступної команди:
DB <25> 10 друку ("curdir є $ curdir \ n");
Потім команда L відображає дію цього рядка, як показано тут:
головний: :( налагодження: 10): $ curdir = ~ s / ^ \ s + | \ s + $ // g; дія: print ("curdir є $ curdir \ n");
Дія лінії завжди відображається відразу після рядка, для якого вона визначена. Цей спосіб відображення дозволяє відрізнити рядки, що містять дії рядків, від інших рядків, що відображаються командою L.
У наступних розділах описані команди налагодження, які раніше не охоплені.
Виконання інших заяв Perl
У відладчику все, що не є командою налагодження, вважається твердженням Perl і виконується відразу. Наприклад:
DB <4> @array = (1, 2, 3);
Ви можете використовувати такі оператори, щоб змінити значення у вашій програмі під час її виконання. Ця можливість корисна при тестуванні коду.
ПРИМІТКА
За бажанням ви можете опустити крапку з комою в кінці заяви.
Команда H: Перелік попередніх команд
Команда H (для "історії") перераховує попередні кілька введених команд.
БД <4> Н 3: b 7 2: b 14 1: b 13
Команди перераховані у зворотному порядку, при цьому найперше вказана команда. Кожній команді передує її номер команди, який використовується символом! команда (описано в наступному розділі).
ПРИМІТКА
Налагоджувач зберігає лише команди, які фактично впливають на середовище налагодження. Такі команди, як l і s, які виконують корисну роботу, але не змінюють поведінку налагоджувача, не перераховуються командою H. Це не є істотним обмеженням, оскільки ви можете знову ввести лист при необхідності.
The! Команда: виконання попередніх команд
Кожна команда, яка зберігається налагоджувачем і може бути перерахована командою H, має номер команди. Цей номер команди можна використовувати для повторення раніше виконаної команди. Наприклад, щоб повторити команду №5, введіть такий запис:
БД <11>! 5 b 8 БД <12>
Налагоджувач відображає команду № 5-в цьому випадку команда b 8- і потім виконує її.
Якщо ви опустите число, відладчик повторює останню виконану команду.
DB <12> $ foo + = $ bar + 1 DB <13>! $ foo + = $ bar + 1 БД <14>
Якщо ви вказали від'ємне число за допомогою !, відладчик пропускає назад, що багато команд:
DB <14> $ foo + = $ bar + 1 DB <15> $ foo * = 2 БД <16>! -2 $ foo + = $ bar + 1 БД <17>
Ось! -2 команда відноситься до команди $ foo + = $ bar + 1.
Команда T: Відстеження стека
Команда T дозволяє відображати трасування стека, що представляє собою сукупність всіх викликів підпрограм, перелічених у зворотному порядку. Ось приклад:
DB <16> T $ = & main :: sub2 ('привіт') з файлу debug1 рядок 7 $ = & main :: sub1 ('привіт') з файлу debug1 рядок 3
Тут команда T вказує, що програма наразі знаходиться в підпрограмі sub2, яку викликали з рядка 7 вашої програми; ця підпрограма є частиною основного пакету. Виклик до sub2 передається аргументом "привіт".
$ =, Що передує імені підпрограми, означає, що виклик підпрограми очікує скалярне повернене значення. Якщо дзвінок очікує повернення списку, перед іменем підпрограми з'являються символи @ =.
Наступний рядок відображеного виводу говорить про те, що sub2 викликався іншою підпрограмою, sub1. Цій підпрограмі також було передано аргумент "привіт", і він викликався рядком 3 програми. Оскільки в сліді стека немає списку підпрограм, рядок 3 є частиною вашої основної програми.
ПРИМІТКА
Список аргументів, переданих підпрограмі, яка відображається слідом стека, - це список фактичних значень після виконання змінної підстановки та оцінки виразів. Ця процедура дозволяє використовувати трасування стека, щоб перевірити, чи передаються вашим підпрограм значень, які ви очікуєте.
Команда p: Друк виразу
Простий спосіб друкувати значення виразу всередині налагоджувача - це використовувати команду p.
DB <17> p $ curdir + 1 1
Команда p оцінює вираз і відображає результат.
ПРИМІТКА
Команда p записує на екран, навіть коли програма перенаправляє STDOUT у файл.
Команда = Визначення псевдонімів
Якщо ви неодноразово входите в довгу команду налагодження і хочете зберегти себе набравши текст, ви можете визначити псевдонім для команди long, використовуючи команду =. Наприклад:
DB <15> = pc print ("curdir є $ curdir \ n"); = pc print ("curdir - $ curdir \ n");
Команда = друкує псевдонім, який ви тільки що визначили, а потім зберігає його в асоціативному масиві% DB'alias (пакет DB, псевдонім імені масиву) для подальшого використання. Звідси команда
БД <16> шт
еквівалентна команді
DB <16> print ("curdir є $ curdir \ n");
Щоб перелічити визначені вами псевдоніми, введіть команду = від себе:
DB <17> = pc = print ("curdir є $ curdir \ n")
Ця команда відображає ваші визначені псевдоніми та їх еквівалентні значення.
Визначення псевдонімів
Ви можете визначити псевдоніми, які потрібно створити щоразу, коли ви входите в відладчик Perl.
Коли запускається налагоджувач, він спочатку шукає файл з назвою .perldb у вашому домашньому каталозі. Якщо налагоджувач знайде цей файл, він виконує викладені там заяви.
Щоб створити псевдонім, додайте його у файл .perldb. Наприклад, додати псевдонім
= pc print ("curdir - $ curdir \ n");
додайте у файл .perldb таке твердження:
$ DB'alias {"pc"} = 's / ^ pc / print ("curdir є $ curdir \ n"); /';
Ось як це працює: коли налагоджувач Perl створює псевдонім, він додає елемент до асоціативного масиву $ DB'alias. Підпис для цього елемента - псевдонім, який ви визначаєте, а значення - команда заміщення, яка замінює псевдонім фактичною командою, яку ви хочете використовувати. У попередньому прикладі підміна бере будь-яку команду, починаючи з pc, і замінює її
print ("curdir є $ curdir \ n");
H Команда: Довідка з налагодження
Команда h (для довідки) надає список кожної команди налагодження, перерахованої на сьогоднішньому уроці, а також однорядкове пояснення кожної з них. Це зручно, якщо ви знаходитесь в середині налагодження програми та забули синтаксис певної команди.
Сьогодні ви дізналися про налагоджувач Perl. Цей налагоджувач дозволяє виконувати такі завдання, серед інших:
- Список будь-якої частини вихідного файлу
- Покрокуйте програму по одній заяві
- Показати будь-які визначені вами змінні
- Встановіть точки перерви, які вказують налагоджувачу, коли потрібно зупинитися, і запитуйте подальші команди
- Встановіть рядкові дії, які є операторами, які слід виконати, коли програма досягає певного рядка
- Простежте виконання програми, як це відбувається
- Роздрукуйте трасування стека, в якому перераховано поточну підпрограму, в якій ви перебуваєте, та підпрограми, які її викликали
Ні; однак реальної потреби в цьому немає. Якщо ви хочете виконати кілька одиничних кроків одночасно, скористайтеся командою c, щоб перейти до зазначеної точки. Якщо ви хочете зробити крок вперед і надрукувати значення змінної, скористайтеся командою <або>. Питання: Чи можливо досліджувати змінні в одному пакеті, перебуваючи всередині іншого? Відповідь: Так. Використовуйте команду V або синтаксис стандартного пакету / змінної Perl. Питання: Якщо я виявлю, що моя програма працює, і я хочу вимкнути налагодження, що робити? Відповідь: Ви не можете вийти з налагоджувача посеред програми. Однак якщо ви видалите всі точки перелому та дії рядка, а потім введете команду c, програма починає виконуватись нормально і вже не перебуває під контролем налагоджувача. Питання: Як я можу перетворити на точку розриву багаторазового використання одноразову точку розриву, створену з використанням c A: За замовчуванням команда b встановлює точку розриву в рядку, який збирається виконати. Це лінія, на якій c встановила свою одноразову точку розриву. Питання: Як я можу виконувати інші команди UNIX всередині налагоджувача? A: Введіть оператор, що містить виклик до функції системи Perl. Наприклад, щоб відобразити вміст поточного каталогу, введіть таку команду:
Система DB <11> ("ls");
Щоб тимчасово вийти з налагоджувача до оболонки UNIX, введіть таку команду:
Система DB <12> ("sh");
Коли ви закінчите з оболонкою, введіть команду вихід, і ви повернетесь до налагоджувача. Питання: До яких спеціальних вбудованих змінних можна отримати доступ всередині налагоджувача? Відповідь: Усі вони.
Практикум надає вікторинні запитання, щоб допомогти вам зміцнити своє розуміння матеріалу, що охоплюється.
Вікторина
- Визначте такі терміни:
- режим слідування
- стек слід
- точка зламу
- дія лінії
- Поясніть відмінності між командами X і V.
- Поясніть відмінності між // і ?? команди.
- Поясніть відмінності між командами <і>.
- Поясніть відмінності між командами s та n.
- Що виконують наступні команди?
- л
- l 26
- l 5-7
- l 5 + 7
- ш




Readsubdir?
Ви необов'язково можете пропустити фінал / або?
Поясніть відмінності між // і ?
Що виконують наступні команди?