Podstatné ladenie

link: http://blog.parr.us/2014/11/17/the-essentials-of-debugging/

Terence Parr, 18. September 2004

Najčastejšie vyhlásenie mám z mojich študentov je maddeningly nejasné: “moje program nepracuje“. Moja odpoveď je zvyčajne, “dobre, nie je to zaujímavé” alebo “dobre, ako si myslíte, že ste zvládnem” lebo chcem študentov učiť sa samostatnosti a diagnostických/ladenie zručnosti. Zatiaľ nie veľmi poučné, zvyčajne to má požadovaný efekt–študent zhasne a kladie jeho alebo jej mozog pracovať myslieť o probléme. Povedal, že, vždy som bol nespokojný môj brute-force “kick off the deep end” prístup. Premýšľala som, či tam bol spôsob, ako učiť ladenie sám.

Najviac znepokojujúce vec, pre mňa je, že mnoho študentov a dokonca aj komerčné kodérov zdať zmraziť ako jeleň v svetlomety, keď nečakané problémy nastanú. Niektoré doslova skúste len tak náhodne mení veci, alebo ešte horšie, ich vyskúšať program ešte niekoľkokrát dúfať, že to bude opäť začať pracovať. Tam sú dva hlavné problémy v práci: (i) nemajú žiadnu predstavu, ako prístup ladenie a (ii) že nemá istotu, že môžu nechtov problém. Dúfam, že pre zlepšenie situácie s týmto esej prostredníctvom jednoznačného prístup programátorov môže nasledovať, alebo najmenej dáva ľuďom miesto, kde začať.

Existuje mnoho druhov programovanie problémy a budem potrebovať na úzke zameranie mať nádej odhalenia procesu ladenia. Algoritmus vykonávanie chyby sú primerane ľahko vypátrať s ladiaci nástroj. Stačí krok prostredníctvom hľadáte neplatný štátu alebo zlé dáta; posledný výpis vykonať, sa buď mýli, alebo vo všeobecnosti bodov, ste na problém. Potom sú tu skutočne bizarné problémy, ktoré vzdorovať logiky. V jazykoch ako C/C++, mohli by ste mať buffer pretečeniu situácia, že obrúsky z vášho komína aktivačný záznam vedie k naozaj šialený výsledky; životné prostredie je poškodený. V jazykoch ako Java, kde to nie je možné, však, ešte stále sa môžete dostať naozaj bizarné problémy. Tu sa zameriam na typ problému, kde triviálna kúsok kódu, ktorý by mal fungovať, nie je.

Za roky, čo som hľadal jednoduchý príklad by som mohol použiť na ilustráciu niektorých kľúčových procesov poskakuje v mojej hlave, ako som útoku jeden z týchto bizarné problémy. Potrebovala som naozaj problém mätúce, ale ten, ktorý bol tak jednoduchý, že by to mohlo byť popísané rýchlo, aby všetky programátor; jeden, ktorých riešenie bolo zrejmé, raz vysvetlil. Tento príspevok popisuje taký problém a cestu k jeho úspešné riešenie. Najprv som si definovať (pozemskom) problém sám a potom urobiť-through proces riešenia problému. V poslednej časti, som sa pokúsil zhrnúť podstatné, čo sa dialo v mojej hlave počas ladenia relácie.

Problému

Jeden piatok popoludní na Jeseň 2004, môj obchodný partner Tom mi volal na mobil, aby sa ma pýtajú, či by mohol popísať problém pre mňa. Vedel som, že problém bol škaredý, ak potreboval hovoriť s niekým iným; jeho programovanie a ladenie zručnosti sú impozantné. On naozaj len potrebné inú perspektívu, myslel som si (aj keď ani jeden z nás je dobre vyznajú v HTML mail problémy). Ukazuje sa, že jeden URL problém pne dva z nás na pár hodín.

Tom bol generovanie HTML e-mailových správ s vložené odkazy, ale presne jeden z tých, odkazy nešiel na pravej strane na webe, keď ste klikli na to. Vedel presne, čo bol odkaz príčinou problému a zákazníci boli svedkami zrejme rovnaký problém. Tu to je:

<a href="http://foo.com/x?event=goto_add&ha_id=10954648">...</a>  

Zdá v poriadku, však? Určite sa takto platnú adresu URL syntax. To je rovnaké syntakticky všetky ostatné odkazy, ktoré fungujú. Odkaz sa dostal k jeho servlet ako:

http://foo.com/x?event=goto_add&ha_id%  

=10954648 sa skonvertujú na jednoduchý percent znakom “%”! Odkazy ako napríklad:

http://foo.com/y?event.accept&address=ZWxrQHJlZG  

pracoval perfektne, aj keď.

Že sa všetky informácie, ktoré mi dal.

Twisted cestu k riešeniu

Moja prvá myšlienka bola, že tam bol divný chybu v Mac OS X mailer bol pomocou, ktoré extrahovali odkaz nesprávne. Uviedol, že ostatní používatelia, zdalo sa, ktoré majú rovnaký problém, ale my sme sa rozhodli vylúčiť OS X mailer pomocou web-based mail hosť ako yahoo.com. Rovnaký problém-zlé spojenie. Ah! Čo ak sa v prehliadači a mailer použiť rovnaké HTML rendering kód? Naložili sme IE pre Mac a príliš mal problém. Hmm…čo by mohlo byť zapojené v preklade tohto URL až do jeho servlet? Ak nie je v ťažbe z adresy URL na e-mail, mohlo by to byť v webový server, ktorý prijíma URL. Mohol živice (web server) majú divný chybu, ktorá spôsobila to, aby mangle URL tvrdenia poskytujeme na servlet? Rozhodli sme sa, že to bolo sakramentsky nepravdepodobné, že vo všeobecnosti a najmä tu, pretože funguje na iné adresy Url, ktoré sú ešte viac komplikuje.

Chýbajú ďalšie nápady odvodené od dane, snažili sme sa o nasledujúce experimenty:

  • pomocou jednoduchých úvodzoviek okolo URL v značke namiesto úvodzoviek.
  • používanie č citácie okolo URL
  • zmeniť názov argumenty; myslel som, že snáď podčiarknutia v ha_id bolo nepríjemné mailer
  • zmena poradia argumentov
  • zmenou počtu argumentov

Nič nezmenilo; zlé spojenie. Sme tiež sa snažil zmena = URL uniknúť %3D, mysliac si, že tam bol nejaký divný uniknúť vec sa deje, ale je webový server a potom nevidel ha_id ako argument (rovná, potom to je unikol).

Ak sme predpokladali URL bolo v poriadku, niečo, čo musí byť v poriadku s HTML kód okolí URL. Ktorá vyzerala úplne jemné tiež a pohybuje sa v okolí HTML okolo nemal žiadny vplyv. Dead-end.

Rozhodli sme sa, že to páči alebo nie, tam bolo niečo o ktoré konkrétne adresy URL, a pravdepodobne to, že jeden argument, že bol neplatný. Spýtal som sa, či tam bola nejaká javascript alebo iné predspracovanie deje, ktoré by mohli zmeniť URL predtým to bolo odoslané z mailer prehliadača. Nie, že by sme mohli nájsť, alebo myslieť.

Ak adresa URL má niečo zle s ním, čas porovnať URL niečo, čo funguje. Aký je rozdiel medzi argumenty ha_id=10954648 a adresa=ZWxrQHJlZG ? Jasne, jeden argument je číslo, a iné nie je. Dáme Z pred 10954648 a vloží kód do spracovania servlet, aby sa vyzliekli, prvý znak z ha_id argument. Fungovalo to! Celkom neuspokojivý, však, pretože sme nevedeli prečo.

Tam bolo niečo o rovná, za ktorými nasleduje číslo. Dobre sme vedeli, že výsledok je Base64 MIME typ čalúnenia charakter, ale že by sa vysvetliť, ako to a argument dostal previesť na percenta. Hmm…ale bolo tam určite niečo zle s sa rovná nasleduje sekvencia čísel.

Snažili sme sa veľa vyhľadávaní google, ako je napríklad “rovná e-mailovú adresu URL problém”, atď., ale nájsť nič vhodné. Ok, to jog nič v mojej pamäti?

Späť, keď som bol s použitím text-založené emailer, niekedy som dostal e-mail, ktorý väčšinou vyzeral ako text, ale mal veľa =0A a iné šialené veci v ňom. Pozreli sme sa, aké 10 hex (prvé dva znaky 10954648) bol z hľadiska ASCI; je to data link uniknúť znak. V desiatkovej, je to obyčajný. 109 hex (prvé tri znaky z id) je malé písmeno m, Takže =10 vari sa zdá, že výnos percento znakov (ASCII kód 45 decimal).

Snažili sme sa google opäť na e-mail typov kódovania, ako to malo byť niečo, čo súvisí s. Konečne sme našli kľúčové slovo “citoval-tlač”, ktoré potom viedli nás uvedomiť si to vysvetlil všetky známe správanie, pretože jeho ukončovací znak je znak rovná sa! Pozreli sme sa a naozaj hlavičky e-mailu, povedal:

Content-Transfer-Encoding: quoted-printable  

Sme zmenili ha_id=10954648, ha_id=3D10954648, pretože 3D hex je rovná ASCII znak a voila! Fungovalo to! Odstránenie úniku a Content-Transfer-Encoding hlavičky, z pôvodnej adresy URL a všetky ostatné práce v pohode.

Riešenie je zrejmé, raz vidieť je, ale kombináciou logiky, výskumu a experimentov, bolo potrebné vyriešiť ju (ako je často prípad). Tento typ problému môže trvať navždy vyriešiť, ak nemáte slušné ladenie inštinkt.

Essentials

Čo môže byť zovšeobecnený z procesu vyššie? Som dospela k záveru, že existuje šesť základných prvkov, ktoré musia zamestnávať:

  1. Reprodukovateľnosti. Najprv musí nájsť spôsob, ako spoľahlivo reprodukovať chybu, ktorá v sebe často len body, ktoré si rovno na problém cez deduktívne uvažovanie. Chyba sa môže stať v práve jedna okolnosť, ktorá môže stať len v jednom mieste v kóde. Chyba, ktorá sa objaví náhodne, je v podstate neriešiteľný, ak máte skok pohľad. Potrebujete zárukou príčina a účinok, takže môžete robiť závery o zmenách si predstaviť. Zmeny v kóde, ktorý “opravy” problém môže alebo nemusí opraviť naozaj to ako problém náhodne objaví a zmizne.
  2. Zníženie. Znížiť problém na jej podstatu. Pretože naše mozgy sú obmedzené, musíme mať najmenší vstup, ktorý spôsobí chybu. Jednoduchšie údaje alebo cestu k chybu, ľahšie sa vám bude dedukovať, alebo sledovať problém. Veľký súbor údajov prináša veľké množstvo “šum”, ktorý camoflages základné položky spôsobuje problémy. Ak máte veľké vstupné údaje súboru, ktorý spôsobuje tento problém, postupujte binárne vyhľadávanie typu zníženie. Rez súbor v polovici, vyhadzovali posledného pol. Ak máte stále problém, potom môžete ignorovať konečné polovicu. Ak sa problém odstránil, a potom začať whittling dole konečné polovicu, ako to musí obsahovať vstup, ktorý spôsobuje problém.
  3. Odpočet. Toto je vaša primárna zbraň, akonáhle ste sa dostali malý vstup, ktorý spoľahlivo spôsobuje problém. To, čo je všeobecné cestu cez program používaný na vstup? Čo komponent(y), môže byť problém alebo mangle údajov tak, že budúca komponent zlyhá? Aký je rozdiel medzi týmto vstup, ktorý nepracuje s niektoré vstupné, ktoré funguje? Skúste znížiť rozsah možnosti tvarovania a eliminuje hypotézy. Napríklad, sme eliminovať možnosť, že Mac OS X emailer mal chybu tým, reprodukciu chyba pomocou IE a web-based mailer. V tom zmysle, že tento proces je veľmi podobný nasleduje experimentálnych fyzikov, ktorí sa snažia vysvetliť prírodné javy, s teória alebo rovnice. Na podporu svojich tvrdení, musia starostlivo navrhnúť experimenty, ktoré, ak budú úspešní, majú iba jeden pravdepodobné vysvetlenie–konkrétne ich teórie. Iných fyzikov pokúste sa reprodukovať výsledky overiť alebo vyvrátiť hypotézu.
  4. Experimentovanie. Psychológ štúdia Ľudskej mysle testovaním v ňom variácie situácie s rôznymi podnetmi. Používajú skenovanie mozgu, odozvy, a tak podporiť ich hypotézy o tom, ako náš mozog pracovať. Podobne, musíte zmeniť podmienky skúšky s cieľom zistiť, či je vaša chyba zmizne. Ak ste opraviť bug so zmenou, že zmeniť by sa povedať, v čom je problém, alebo aspoň dať si veľký náznak o tom, čo sa deje. Môžete tvoriť hypotézy s logiku a deduktívne uvažovanie a potom filtrovať podľa pokusy a pozorovania. Napríklad, experimentovanie, došli sme k záveru, že to bol konkrétne tvrdenie sme používali, ktorý spôsobil problém. Konečne sme sa zúžil dole (použitím nejaké skúsenosti) “sa rovná ako uniknúť” problém.
  5. Skúseností. Neexistuje žiadna náhrada pre prax. Stáva dobrú programovanie vo všeobecnosti znamená, apprenticing sami dobrý programátor alebo fumbling si cestu cez sami na niekoľko rokov (v oboch smeroch, takže veľa chýb). Skúsenosti pomáha v ladenia proces v dvoch ohľadoch: (i) máte zdokonaľovali svoje schopnosti vykonávať predchádzajúce štyri prvky a (ii), ktoré ste mohli vidieť podobnú chybu, alebo len obyčajný vedieť viac o konkrétny problém. Napríklad, mal som videl znak rovná ako ukončovací znak v e-mailovú pred a budúci čas som vidieť, či sa ma niekto spýta asi URL problém v HTML mail, prvá vec, ktorú som si požiadať o ich kódovanie. Pôžičky skúseností ostatných vývojárov je tiež dôležité. Vyhľadávanie na webe a hovoriť s inými vývojármi, môžete ušetriť obrovské množstvo úsilia, ak sa využije od iných národov skúsenosti. Zaujímavé je, vysvetľovaniu problém na iný developer (alebo aj váš manžel/priateľ) môže line veci do správne vo vašej hlave tak, že jednoduchý odpočet povie vám, kde problém.
  6. Húževnatosť. Všetky chyby sú spôsobené počítače robí presne to, čo im bolo povedané, nie je absolútne žiadne tajomstvo, preto všetky problémy sú riešiteľné. Musíte začať s postoj, že ste sa nikdy vzdať bez ohľadu na to, ako dlho to trvá ak chcete nájsť problém a ako ich opraviť. Budete mať viac a viac istý, zakaždým, keď budete riešiť problém. Musíte byť húževnatý. Nikdy som niekedy odišiel chybu nevyriešené, ktoré som považoval za hodné stanovenie. Niekedy dĺžky budete musieť ísť, sú extrémne, ale výsledok dobrý “vojnové príbehy.” Raz, keď ladenie malé zariadenie, ovládanie robota, môj jediný odkaz na vonkajší svet bol LED, že by som blikať. Musel som sa pripojiť osciloskop sa pozrieť na to, ako bol softvér krúti LED! Ako vedľajší efekt riešenia zákerné chýb, budete sa oveľa lepšie, programátor, ako začnete predvídať chyby a kód spôsobom, ktorý je menej pravdepodobné, že na výrobu záhadné chyby.

V praxi tieto šiestich prvkov sa používajú v kombinácii a v rôznych aby, keď body 1 a 2 zmysel urobiť prvý.

Ak ste našli chybu?

Len ako proces ladenia sám je dôležité, vedieť, kedy môžete prestať je tiež veľmi dôležité. Tam sú dva hlavné princípy internalizovať, takže môžete rozpoznať, keď máte skoncovala chybu.
Po prvé, Môžete sa nemôže spoliehať na riešenie, ktoré len sa zdá, že funguje, ale ktoré nemožno pochopiť. Mnoho programátorov zastaviť, keď je niečo, čo chcete zmeniť kód je chyba zmizne, aj keď netuším prečo. To nie je riešenie. Ak chyba pretrváva, máte len skryté to v súčasnosti. Napríklad, Tom a ja som sa nezastavil po tom, čo sme boli schopní vytvoriť prepojenie práce skratky identifikačné číslo (ID) s Z; sme mali len skrytý problém. “Nikdy nenechávajte nepriateľa na chrbát,” ako sa hovorí.

Po druhé, a takmer rovnako zlé, ako tie, ktoré nemajú vysvetlenie, má teóriu, že nevysvetľuje všetky známe správanie. Jeden nevysvetliteľné problém vyplýva ste nenašli skutočné riešenie alebo existuje viacero chýb v hre. Pripomeňme, že teóriu fyzika alebo matematika môže byť zostrelený jeden counterexample. Príbeh je povedané o Einstein počas 1930. Bol otázku novinárov, či bol strach, že tak mnohých významných nemeckých fyzikov prišli dopredu, aby zľavu jeho teórie relativity. Einstein odpovedal jednoducho: No, ak relativity boli nesprávne by to trvať len jeden fyzik ak ho chcete zobraziť.

Zhrnutie

Ladenie môže byť jedným z najťažších a frustrujúce aspekty, že programátor, ale váš postoj môže znamenať veľký rozdiel. Som prístup škaredé problém, ako keby to bol zaujímavý, alebo náročné záhadu vyriešiť. Okrem toho som útoku problém s dôverou, s vedomím, že nakoniec som sa bude riešiť problém. Váš postoj môže tiež znamenať rozdiel medzi dobrým programátorom a zlý programátor. Spýtal som sa pilot kamarát raz, ak bol narušený, keď sa mu museli vykonávať ťažké pristátie v silnom vetre. On odpovedal, že nie, väčšinu času letu, je bežné–pilotov zarobiť svoje peniaze počas ťažké pristátie a niektoré si príležitosť preukázať svoju zdatnosť. Podobne, programátorov rozlišovať seba najzreteľnejšie keď sa dozvedia ťažké chyby riešiť. Podstatné je popísané v tejto práci by mali dať študentom a nových programátorov aspoň stratégie, sledovať, tým, že sa im dôveru nájsť a opraviť svoje chyby.

Ja by som sa chcel poďakovať Tom Burns a Sriram Srinivasan za ich užitočné návrhy na tento príspevok.

Leave a Reply

Your email address will not be published. Required fields are marked *