Водич за Пајтон 2.6/Дебаговање

Извор: Викикњиге
Пређи на навигацију Пређи на претрагу

Шта је дебаговање?[уреди]

"Чим смо почели са програмирањем, открили смо на наше изненађење да није лако да добијемо прави програм као што смо мислили. Откривање грешака, дебаговање, морало би да буде откривено. Ја могу да се сетим тачног тренутка када сам схватио да је то велики део мог живота од тада сам решио да би требало да се потроши у проналажењу грешке у својим програмима." — Maurice Wilkes discovers debugging, 1949

Ако сте се до сада играли са програмима вероватно сте схавтили да програм понекад ради нешто што ви нисте желели да уради. Ово је прилично уобичајено. Дебаговање је процес разумевања шта рачунар ради и онда га напишете да ради тачно оно шта хоћете. То може бити незгодно. Једном сам провео готово недељу у промалажењу и фиксирању грешке која је узрокована нечијим стављањем x где је y требало да буде.

Ово поглавље ће бити више апстрактно него претходна поглавља.

Шта би програм требало да ради?[уреди]

Прву ствар коју треба да уради (ово звучи очигледно) је да схвати шта би програм требало да ради ако је добро покренут. Смислите неки тест случајева и видите шта се дешава. На пример, да кажемо да имам програм за рачунање обима правоугаоника (збир дужине свих ивица). Имам следеће тестове:

висина ширина обим
3 4 14
2 3 10
4 4 16
2 2 8
5 1 12

Сада покрећем програм на свим случајевима теста и видим да програм ради оно што сам очекивао. Ако не ради онда морам да сазнам шта рачунар ради.

Чешћи су неки од случајева да ће тест радити од неких да неће. Ако је то случај требало би да покушате и схватите Шта они који раде имају заједничко. На пример овде је излаз за израчунавање обима (видећете код за тренутак):

Висина: 3
Ширина: 4
обим = 15
Висина: 2
Ширина: 3
обим = 11
Висина: 4
Ширина: 4
обим = 16
Висина: 2
Ширина: 2
обим = 8
Висина: 5
Ширина: 1
обим = 8

Приметите да није радио за прва два уноса, радио је за следећа два и није радио на последњем. Покушајте да схватите шта је заједничко онима који раде. Једном када имате идеју шта је проблем проналажење узрока је лакше. Са вашим личним програмима требало би да покушате са више тестова ако вам затребају.

Шта програм ради?[уреди]

Следећа ствар коју треба да урадите је да погледате изворни код. Једна од најважнијих ствари које треба да урадите док програмирате јесте да читате изворни код. Основни начин да урадите ово је да прођете кроз код.

Пролазак кроз код почиње на првој линији, и таје док се програм не заврши. While петње и if изјаве значе да неке линије можда никад неће бити покренуте и да ће неке бити покренуте више пута. На свакој линији схватате шта је Пајтон урадио.

Почнимо са једноставним програмом обима. Не куцајте га, само га прочитајте, и не покрећите. Изворни код је:

висина = input("Висина: ")
ширина = input("Ширина: ")
print "обим =", ширина + бисина + ширина + ширина
Питање: Шта је прва линија што Пајтон покреће?
Одговор: Прва линија се увак прва покреће. У овом случају то је: висина = input("Висина: ")
Шта та линија ради?
Штампа Висина: , чека да корисник укуца број, и ставља то у променљиву висина.
Шта је следећа линија коју покреће?
У општем случају, то је следећа линија што је: ширина = input("Ширина: ")
Шта та линија ради?
Штампа Ширина: , чека да корисник укуца број, и ставља то у променљиву ширина.
Шта је следећа линија коју покреће?
Када следећи ред није увучен више или мање од тренутне линије, то је линија одмах након тога, па је то: print "обим = ", ширина + висина + ширина + ширина (Такође може покренути функцију у одговарајућем реду, али то је следеће поглавље.) Шта та линија ради?
Прво штампа обим = , затим штампа ширина + висина + ширина + ширина.
Да ли ширина + висина + ширина + ширина рачуна обим правилно?
Да видимо, обим правоугаоника је доња страница (ширина) плус лева страница (висина) плус горња страница (ширина) плус десна страница (ха?). Последњи податак би требало да буде душина десне странице, или висина.
Да ли разумете зашто је у неко време обим био рачунан "правилно"?
Био је добро рачунана када су висина и ширина једнаке.

Следећи програм који ћемо радити проласком кроз код је програм који би требало да штампа пет тачака на екрану. Међутим, ово је оно што програм избацује:

. . . . 

И овде је програм:

број = 5
while број > 1:
    print ".",
    број = број- 1
print

Пролазак кроз овај програм је много сложенији јер сада има увучене делове (или контролне структуре). Хајде да почнемо.

Која је прва линија кроз коју ће проћи?
Прва линија датотеке: број = 5
Шта ова линија ради?
Ставља број 5 у променљиву број.
Која је следећа линија?
Следећа линија је: while број > 1:
Шта она ради?
Па, while изјава у глобалу на њихов израз, и ако је то тачно раде следећи блок кода, у супротном прескоче увучени блок кода.
Па шта сада ради?
Ако је број > 1 тачно онда ће се покренути две следеће линије.
Да ли је број > 1?
Последње две дате вредности број су 5 и 5 > 1 тако да јесу.
Па шта је у следећој линији?
Одкад је while тачно следећа линија је: Print ".",
Шта та линија ради?
Штампа једну тачку и пошто се изјава завршава са ',' следећа изјава штампања неће бити у другој линији реда.
Шта је у следећој линији?
број = број - 1 пошто је то следећа линија и ту нека никаквих промена.
Шта то ради?
Рачуна број - 1, што је одговарајућа вредност број (или 5) који одузима 1, и ствара нову вредност броја. Па у основи мења број'ну вредност са 5 на 4.
Шта је следећа линија?
Па, следећи ниво опада тако да морамо да погледамо шта је тип контролне структуре. То је while петња, па морамо да се вратимо на while тачку што је while број > 1:
Шта ово ради?
Погледа вредност броја, што је 4, и пореди је са 1 и пошто је 4 > 1 while петља се наставља.
Шта је следећа линија?
Пошто је while петља тачна, следећа линија је: print ".",
Шта она ради?
Штампа следећу тачку у линији.
Шта је следећа линија?
Ништа се не мења па је: број = број - 1
И шта ово ради?
Узима одговарајућу вредност броја (4), одузме 1, што даје 3 и на крају ствара 3 нову вредност броја.
Шта је следећа линија?
С обзиром на то да је промена изазвана на крају while петље, следећа линија је: while број > 1:
Шта она ради?
Пореди одговарајућу вредност броја (3) са 1. 3 > 1 па се while петља наставља.
Шта је у следећој линији?
С обзиром да су услови у while петљи тачни следећа линија је: print ".",
И шта ради?
Трећа тачка је уписана у линији.
Шта је следећа линија?
То је: број = број - 1
Шта ради?
Узима одговарајућу вредност броја (3) одузима му 1 и прави 2 као нову вредност броја.
Шта је следећа линија?
Назад до почетка while петље: while број > 1:
Шта ради?
Пореди одговарајућу вредност броја (2) са 1. Пошто је 2 > 1 while петља се наставља.
Шта је следећа линија?
Пошто се while петља наставља: print ".",
Шта ово ради?
Открива значење живота, универзума и свега. Шалим се. (Морам да се побринем да сте будни.) Линија штампа четврту тачку на екрану.
Шта је следећа линија?
То је: број = број - 1
Шта ради?
Узима одговарајућу вредност броја (2) одузима му 1 и добија 1 нову вредност броја.
Шта је следећа линија?
Повратак у while петљу: while број > 1:
Шта та линија ради?
Пореди одговарајућу вредност броја (1) са 1. Пошто 1 > 1 је нетачно (један није веће од један), while петља постоји.
Шта је следећа линија?
С обзиром да је стање while петље нетачно следећа линија је линија после while петље, или: print
Шта та линија ради?
Чини да екран пређе у следећи ред.
Зашто програм не штампа 5 тачака?
Петља излази једну тачку раније.
Како можемо то да исправимо?
Направимо да петља изађе једну тачку раније.
И како то да урадимо?
Постоји неколико начина. Један начин је да променимо while петљу у: while број > 0: Други начин је да променимо услове у: број >= 1 Постоји још неколико.

Како преправљам програм?[уреди]

Морате да разумете шта програм ради. Треба да схватите шта би програм требало да ради. Нађите разлику између ова два. Дебаговање је вештина која мора да буде увежбана да би била научена. Ако не мођете да разумете после сат времена, направите паузу, разговарајте са неким о проблему или размишљајте о влакну у вашем пупку. Вратите се у петљу и вероватно ћете имати нове идеје за овај проблем. Срећно.


Шаблон:Водич за Пајтон 2.6/Navigation