Silumisest
Või «Appi, mu kood on katki!»
Selles dokumendis on Eclipse näited heleda taustaga ja IntelliJ näited tumeda taustaga!
Mis on silumine?
«See ei ole defekt — see on dokumenteerimata funktsionaalsus.»
—TUNDMATU PROGRAMMEERIJA
Silumine on defektide ja vigade leidmine ja parandamine.
Vaata lisaks:
https://et.wikipedia.org/wiki/Silumine
https://en.wikipedia.org/wiki/Debugging
Üldised soovitused
Silumisest üldiselt
«Kõik teavad, et silumine on kaks korda raskem kui programmeerimine. Seega kui sa programmeerid nii kavalalt kui oskad, kuidas sa peaksid oskama seda siluda?»
—BRIAN KERNIGHAN
Ennetamine
Silumine ei ole enamike inimeste lemmiktegevus. Kuna kõik aga teevad vigu, siis tuleb seda aeg-ajalt siiski teha. Seega on kasulik kirjutada koodi arvestades sellega, et seda tuleb tulevikus muuta ja siluda.
- Oluline on kirjutada «miks» kommentaare: mitte mida tehakse(see on ju kirjas koodis), vaid miks tehakse:
- Mitte kirjutada liiga keerulist koodi, sest seda on raskem analüüsida
- Jälgida ühe töö printsiipi: funktsioon peaks tegema üht asja
Silumisprotsess
«Arvutite ajaloos pole silumine kunagi võtnud üllatavalt vähe aega.»
—STEVEN LEVY
- Muuda üht asja korraga: see lihtsustab põhjuse leidmist
- Selgita oma koodi kellelegi, kasvõi kummipardile: see aitab ise koodi mõista.
- Sektsioon: silumistehnikad
Vaata lisaks:
https://www.ibm.com/support/knowledgecenter/en/SSY2VQ_2.0.0/com.ibm.aix.pli.doc/ibmx2mst131.htm
https://onextrapixel.com/10-useful-tips-for-debugging-and-troubleshooting-in-programming/
https://rubberduckdebugging.com/
Java
«Kui sa õpid programmeerima Javas, on sul alati tööd!»
—PATRICIA SEYBOLD, 1998
- Kuula kompilaatori hoiatusi ja soovitusi
IntelliJ:
- Analyze→Inspect Code
- Eriti Probable Bugs
- Välja lülitada Internationalization issues ja Spelling, v.a. inglise keeles programmeerides
Eclipse:
- Kolmanda osapoole laiendus: FindBugs
- Help→Install New Software…
- http://findbugs.cs.umd.edu/eclipse
- Järgi instruktsioone ja taaskäivita Eclipse
- Paremklõps projektil ja Find Bugs
Invariandid(assertid)
Assert-laused ehk invariantide kontroll lubab koodis kontrollida tingimusi, mis peaksid alati tõesed olema. Sellise tingimuse mittekehtimine peaks näitama viga programmi koodis. Nende kontrollimise saab väljalaskeversioonis välja lülitada.
Vaata lisaks:
https://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html
Silumistehnikad
«Algaja — ma leidsin vea üles
Kogenu — ma leidsin ühe vea üles»
—FIONA CONDON
Kood ei kompileeri
- Loe veateadet!
- IntelliJ:
Alt+Enter
Kood kompileerib, aga teeb valesid asju
Baastehnikad:
- Loe kood mõttega läbi!
- Kasuta silurit, et jälgida programmi käiku
- Logi — lihtne, aga sageli vähem efektiivne kui siluri kasutamine
- Selleks on sobilikum
System.err
; kasutatakse samamoodi kuiSystem.out
- Selleks on sobilikum
Kood hangub
- Logi — kiiresti leiab lõputu tsükli
- Pane siluriga pausile ja vaata pinujälge(stack trace)
Siluri kasutamine
Silur on tööriist, mis lubab interaktiivselt siluda. Koodi saab huvitavades kohtades sammhaaval jooksutada ning jälgida muutujate väärtuseid.
- 1 Siluri ajastu kivimite lademed Saaremaal (Allikas: Tartu Ülikooli Loodusmuuseumi geoloogiamuusemum)
- Lisa katkepunkte(breakpoint)
- Selleks kliki koodist vasakul reanumbri kõrval
- IntelliJ: paremal üks klikk
- Eclipse: vasakul topeltklikk
- Koodirea kõrvale tekib mull
- Siin peatatakse siludes jooksutamine ja minnakse silumisrežiimi
- Selleks kliki koodist vasakul reanumbri kõrval
- Katkepunkte saab lisada ka erinditile erinditüübi järgi!
- Näiteks kui programm väljub veateatega
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 20
at Arvupaarisummad.main(Arvupaarisummad.java:11)
- IntelliJ: Run→View Breakpoints(
Ctrl+Shift+F8
)→ →Java Exception Breakpoints - Eclipse: Run→Add Java Exception Breakpoint
- Valid erinditüübi; näites
ArrayIndexOutOfBoundsException
- Nüüd peatub programm seda tüüpi erindi esinemisel ja saab vaadata programmi olekut
- IntelliJ: Run→View Breakpoints(
- NB! Osasid erindeid juhtub Java normaalse jooksmise käigus üsna palju; kasulik on peatada ainult Uncaught korral
- Käivita silur
- IntelliJ: Run→Debug või
Alt+Shift+F9
- Eclipse: Run→Debug või
F11
- IntelliJ: Run→Debug või
- Tekivad erinevad variandid koos kiirklahvidega, millega saab läbi projekti sammhaaval minna.
- Avanenud vaates(Eclipse’is tuleb selleks dialoogis Yes vajutada) saab vaadata muutujate väärtuseid ja programmi funktsioonikutsete pinu ehk teekonda main funktsioonist jooksva funktsioonini
- Lisaks saab muutujate ja osade avaldiste kohale hiire viies näha nende hetkeväärtuseid
Inglisekeelseid juhendeid/õpetusi:
Eclipse: http://www.vogella.com/tutorials/EclipseDebugging/article.html
IntellijJ IDEA ametilik: https://www.jetbrains.com/help/idea/debugging.html
Eclipse ametlik: https://www.eclipse.org/community/eclipse_newsletter/2017/june/article1.php
Muud tööriistad, edasijõudnutele: https://www.infoq.com/articles/Advanced-Java-Debugging-Techniques