
Dette er et utvalg historier fra Internett om hvordan feil noen ganger har helt utrolige manifestasjoner. Kanskje du ogsÄ har noe Ä fortelle.
Bilallergi mot vaniljeis
En historie for ingeniÞrer som forstÄr at det Äpenbare ikke alltid er svaret, og at uansett hvor langsiktige fakta kan virke, er de fortsatt fakta. Pontiac-divisjonen i General Motors Corporation mottok en klage:
Dette er andre gang jeg skriver til deg, og jeg klandrer deg ikke for ikke Ä svare, for det hÞres sprÞtt ut. Familien vÄr har tradisjon for Ä spise is hver kveld etter middag. Istypene skifter hver gang, og etter middagen velger hele familien hvilken is de skal kjÞpe, deretter gÄr jeg til butikken. Jeg har nylig kjÞpt en ny Pontiac, og siden den gang har turene mine for Ä fÄ is blitt et problem. Du skjÞnner, hver gang jeg kjÞper vaniljeis og kommer tilbake fra butikken, vil ikke bilen starte. Tar jeg med annen is, starter bilen uten problem. Jeg vil stille et seriÞst spÞrsmÄl, uansett hvor dumt det hÞres ut: "Hva er det med Pontiac som gjÞr at den ikke starter nÄr jeg tar med vaniljeis, men starter lett nÄr jeg tar med en annen smak av is?" "
Som du kan forestille deg, var divisjonspresidenten skeptisk til brevet. Men for sikkerhets skyld sendte jeg en ingeniÞr for Ä sjekke. Han ble overrasket over at han ble mÞtt av en velstÄende, velutdannet mann som bodde i et vakkert omrÄde. De ble enige om Ä mÞtes umiddelbart etter middagen slik at de to kunne gÄ til butikken for iskrem. Den kvelden var det vanilje, og da de kom tilbake til bilen, ville den ikke starte.
IngeniÞren kom tre kvelder til. FÞrste gang isen var sjokolade. Bilen startet. Andre gang var det jordbÊris. Bilen startet. Den tredje kvelden ba han om Ä fÄ ta vanilje. Bilen startet ikke.
Rasjonelt resonnement nektet ingeniÞren Ä tro at bilen var allergisk mot vaniljeis. Derfor ble jeg enig med eieren av bilen om at han skulle fortsette besÞkene sine til han fant en lÞsning pÄ problemet. Og underveis begynte han Ä ta notater: han skrev ned all informasjon, tid pÄ dagen, type bensin, ankomsttid og retur fra butikken, etc.
IngeniÞren innsÄ snart at eieren av bilen brukte mindre tid pÄ Ä kjÞpe vaniljeis. à rsaken var utformingen av varene i butikken. Vaniljeis var den mest populÊre og ble oppbevart i en egen fryser foran i butikken for Ä gjÞre den lettere Ä finne. Og alle de andre variantene lÄ bakerst i butikken, og det tok mye mer tid Ä finne riktig sort og betale.
NÄ var spÞrsmÄlet til ingeniÞren: hvorfor startet ikke bilen hvis det hadde gÄtt mindre tid siden det Þyeblikket motoren ble slÄtt av? Siden problemet var tid, ikke vaniljeis, fant ingeniÞren raskt svaret: det var en gasslÄs. Det skjedde hver kveld, men da bileieren brukte mer tid pÄ Ä lete etter is, klarte motoren Ä kjÞle seg nok ned og startet lett. Og da mannen kjÞpte vaniljeis, var motoren fortsatt for varm og gasslÄsen rakk ikke Ä lÞse seg opp.
Moral: Selv helt sprĂž problemer er noen ganger reelle.
Crash Bandicoot
Det er vondt Ä oppleve dette. Som programmerer blir du vant til Ä skylde pÄ koden din fÞrst, andre, tredje... og et sted pÄ ti tusende plass skylder du pÄ kompilatoren. Og lenger ned pÄ listen skylder du allerede pÄ utstyret.
Her er min historie om maskinvarefeilen.
For spillet Crash Bandicoot skrev jeg kode for Ä laste og lagre pÄ et minnekort. For en sÄ selvglad spillutvikler var det som en tur i parken: Jeg trodde arbeidet ville ta flere dager. Imidlertid endte jeg opp med Ä feilsÞke koden i seks uker. Underveis lÞste jeg andre problemer, men med noen fÄ dager kom jeg tilbake til denne koden i noen timer. Det var smerte.
Symptomet sÄ slik ut: nÄr du lagrer gjeldende gjennomspilling av spillet og fÄr tilgang til minnekortet, gÄr alt nesten alltid bra... Men noen ganger blir lese- eller skriveoperasjonen tidsavbrudd uten Äpenbar grunn. Et kort opptak skader ofte minnekortet. NÄr en spiller prÞver Ä redde, klarer han ikke bare Ä redde, men Þdelegger ogsÄ kartet. Dritt.
Etter en stund begynte vÄr produsent hos Sony, Connie Bus, Ä fÄ panikk. Vi kunne ikke sende spillet med denne feilen, og seks uker senere forsto jeg ikke hva som forÄrsaket problemet. Gjennom Connie tok vi kontakt med andre PS1-utviklere: har noen vÊrt borti noe lignende? Nei. Ingen hadde problemer med minnekortet.
NÄr du ikke har noen ideer for feilsÞking, er den eneste tilnÊrmingen som gjenstÄr Ä "dele og herske": fjern mer og mer kode fra det defekte programmet til det er et relativt lite fragment igjen som fortsatt forÄrsaker problemet. Det vil si at du klipper av programmet bit for bit til den delen som inneholder feilen gjenstÄr.
Men saken er at det er veldig vanskelig Ă„ kutte biter ut av et videospill. Hvordan kjĂžrer du det hvis du fjernet koden som emulerer tyngdekraften? Eller tegne karakterer?
Derfor mÄ vi erstatte hele moduler med stubber som later til Ä gjÞre noe nyttig, men som faktisk gjÞr noe veldig enkelt som ikke kan inneholde feil. Vi mÄ skrive slike krykker for at spillet i det minste skal fungere. Dette er en langsom og smertefull prosess.
Kort sagt, jeg gjorde det. Jeg fjernet flere og flere kodebiter til jeg satt igjen med den fÞrste koden som konfigurerer systemet til Ä kjÞre spillet, initialiserer gjengivelsesmaskinvaren osv. SelvfÞlgelig kunne jeg pÄ dette stadiet ikke lage en lagrings- og lastmeny, fordi jeg mÄtte lage en stubbe for all grafikkkoden. Men jeg kunne late som om jeg var en bruker ved Ä bruke den (usynlige) lagre- og lasteskjermen og be om Ä lagre og deretter skrive til minnekortet.
Dette etterlot meg med en liten kodebit som fortsatt hadde problemet ovenfor - men det skjedde fortsatt tilfeldig! Som oftest fungerte alt bra, men av og til var det feil. Jeg fjernet nesten all spillkoden, men feilen var fortsatt i live. Dette var forvirrende: den gjenvĂŠrende koden gjorde faktisk ingenting.
PÄ et tidspunkt, sannsynligvis rundt tre om morgenen, kom en tanke opp hos meg. Lese- og skriveoperasjoner (input/output) involverer nÞyaktige utfÞrelsestider. NÄr du jobber med en harddisk, minnekort eller Bluetooth-modul, gjÞr lavnivÄkoden som er ansvarlig for lesing og skriving det i samsvar med klokkepulser.
Ved hjelp av en klokke synkroniseres en enhet som ikke er direkte koblet til prosessoren med koden som kjĂžres pĂ„ prosessoren. Klokken bestemmer overfĂžringshastigheten â hastigheten som data overfĂžres med. Hvis det er forvirring med timing, er enten maskinvaren eller programvaren, eller begge deler, ogsĂ„ forvirret. Og dette er veldig dĂ„rlig, fordi dataene kan bli skadet.
Hva om noe i koden vÄr forvirrer tidspunktene? Jeg sjekket alt relatert til dette i testprogramkoden og la merke til at vi satte den programmerbare timeren i PS1 til 1 kHz (1000 ticks per sekund). Dette er ganske mye; som standard, nÄr konsollen starter, kjÞrer den pÄ 100 Hz. Og de fleste spill bruker denne frekvensen.
Andy, spillutvikleren, satte timeren til 1 kHz slik at bevegelser ble beregnet mer nÞyaktig. Andy har en tendens til Ä gÄ over bord, og hvis vi etterligner tyngdekraften, gjÞr vi det sÄ nÞyaktig som mulig!
Men hva om Ä Þke hastigheten pÄ timeren pÄ en eller annen mÄte pÄvirket den generelle timingen av programmet, og dermed klokken som regulerer overfÞringshastigheten for minnekortet?
Jeg kommenterte timerkoden. Feilen skjedde ikke igjen. Men dette betyr ikke at vi fikset det, fordi feilen skjedde tilfeldig. Hva om jeg bare var heldig?
Noen dager senere eksperimenterte jeg igjen med testprogrammet. Feilen gjentok seg ikke. Jeg gikk tilbake til hele spillets kodebase og modifiserte lagrings- og lastkoden slik at den programmerbare timeren ville tilbakestilles til sin opprinnelige verdi (100Hz) fĂžr jeg fikk tilgang til minnekortet, og deretter tilbakestilles til 1kHz. Det var ingen flere krasj.
Men hvorfor skjedde dette?
Jeg gikk tilbake til testprogrammet igjen. Jeg prĂžvde Ă„ finne et mĂžnster i forekomsten av en feil med en 1 kHz timer. Etter hvert la jeg merke til at feilen oppstĂ„r nĂ„r noen spiller med en PS1-kontroller. Siden jeg sjelden ville gjort dette selv - hvorfor skulle jeg trenge en kontroller nĂ„r jeg tester lagre og laste kode? - Jeg la ikke engang merke til denne avhengigheten. Men en dag ventet en av artistene vĂ„re pĂ„ at jeg skulle bli ferdig med Ă„ teste â jeg bannet nok i det Ăžyeblikket â og snurret nervĂžst pĂ„ kontrolleren i hendene. Det har oppstĂ„tt en feil. "Vent, hva?!" Vel, gjĂžr det igjen!"
Da jeg innsÄ at disse to hendelsene var sammenkoblet, klarte jeg enkelt Ä gjenskape feilen: Jeg begynte Ä ta opp til minnekortet, flyttet kontrolleren og Þdela minnekortet. For meg sÄ det ut som en maskinvarefeil.
Jeg kom til Connie og fortalte henne om oppdagelsen min. Hun videreformidlet informasjonen til en av ingeniĂžrene som designet PS1. "Umulig," svarte han, "det kan ikke vĂŠre et maskinvareproblem." Jeg ba Connie om Ă„ avtale en samtale for oss.
IngeniÞren ringte meg og vi kranglet pÄ hans gebroke engelske og min (ekstremt) Þdelagte japanske. Til slutt sa jeg: "La meg bare sende mitt 30-linjers testprogram der flytting av kontrolleren forÄrsaker en feil." Han var enig. Sa at det var bortkastet tid og at han var fryktelig opptatt med Ä jobbe med et nytt prosjekt, men ville gi etter fordi vi var en veldig viktig utvikler for Sony. Jeg ryddet opp i testprogrammet mitt og sendte det til ham.
Neste kveld (vi var i Los Angeles og han var i Tokyo) ringte han meg og ba om unnskyldning. Det var et maskinvareproblem.
Jeg vet ikke nÞyaktig hva feilen var, men fra det jeg hÞrte pÄ Sony-hovedkvarteret, hvis du satte timeren til en hÞy nok verdi, forstyrret den komponenter pÄ hovedkortet i nÊrheten av timerkrystallen. En av dem var en overfÞringshastighetskontroller for minnekortet, som ogsÄ satte overfÞringshastigheten for kontrollerene. Jeg er ikke ingeniÞr, sÄ jeg kan ha rotet til noe.
Men poenget er at det var interferens mellom komponenter pÄ hovedkortet. Og nÄr du overfÞrer data samtidig gjennom kontrollerporten og minnekortporten med en tidtaker som kjÞrer pÄ 1 kHz, gikk biter tapt, data gikk tapt og kortet ble skadet.
DÄrlige kyr
PÄ 1980-tallet skrev min mentor Sergei programvare for SM-1800, en sovjetisk klone av PDP-11. Denne mikrodatamaskinen har nettopp blitt installert pÄ en jernbanestasjon nÊr Sverdlovsk, et viktig transportknutepunkt i USSR. Det nye systemet ble designet for Ä rute vogner og godstrafikk. Men den inneholdt en irriterende feil som fÞrte til tilfeldige krasj og krasj. Fall skjedde alltid nÄr noen gikk hjem om kvelden. Men til tross for en grundig undersÞkelse dagen etter, fungerte datamaskinen korrekt i alle manuelle og automatiske tester. Dette indikerer vanligvis en rasetilstand eller en annen konkurransefeil som oppstÄr under visse forhold. Lei av samtaler sent pÄ kvelden, bestemte Sergei seg for Ä komme til bunns i det, og fÞrst og fremst forstÄ hvilke forhold ved rangergÄrden fÞrte til databruddet.
FÞrst samlet han statistikk over alle uforklarlige fall og laget en graf etter dato og klokkeslett. MÞnsteret var tydelig. Etter Ä ha observert noen dager til, innsÄ Sergei at han lett kunne forutsi tidspunktet for fremtidige systemfeil.
Han fikk snart vite at forstyrrelser bare skjedde nÄr stasjonen sorterte toglaster med storfe fra Nord-Ukraina og vest-Russland pÄ vei til et slakteri i nÊrheten. Dette i seg selv var merkelig, fordi slakteriet ble forsynt av gÄrder som ligger mye nÊrmere, i Kasakhstan.
Kjernekraftverket i Tsjernobyl eksploderte i 1986, og radioaktivt nedfall gjorde omrÄdene rundt ubeboelige. Store omrÄder i Nord-Ukraina, Hviterussland og Vest-Russland ble forurenset. Med mistanke om hÞye nivÄer av strÄling i de ankommende vognene utviklet Sergei en metode for Ä teste denne teorien. Befolkningen ble forbudt Ä ha dosimetre, sÄ Sergei registrerte seg med flere militÊre menn pÄ jernbanestasjonen. Etter flere drinker med vodka klarte han Ä overbevise en soldat om Ä mÄle strÄlingsnivÄet i en av de mistenkelige vognene. Det viste seg at nivÄet var flere ganger hÞyere enn normale verdier.
Ikke bare sendte storfeet ut mye strÄling, nivÄet var sÄ hÞyt at det fÞrte til tilfeldig tap av biter i minnet til SM-1800, som var plassert i en bygning ved siden av stasjonen.
Det var matmangel i USSR, og myndighetene bestemte seg for Ä blande Tsjernobyl-kjÞtt med kjÞtt fra andre regioner i landet. Dette gjorde det mulig Ä redusere det totale nivÄet av radioaktivitet uten Ä miste verdifulle ressurser. Etter Ä ha lÊrt om dette, fylte Sergei umiddelbart ut dokumenter for emigrasjon. Og datakrasj stoppet av seg selv da strÄlingsnivÄet sank over tid.
Gjennom rĂžrene
Movietech Solutions laget en gang programvare for kinoer designet for billettregnskap, salg og generell administrasjon. DOS-versjonen av flaggskipapplikasjonen deres var ganske populÊr blant smÄ og mellomstore kinokjeder i Nord-Amerika. SÄ det er ingen overraskelse at da versjonen ble annonsert, Windows 95, integrert med de nyeste berÞringsskjermene og selvbetjeningskioskene, og utstyrt med alle slags rapporteringsverktÞy, ble ogsÄ raskt populÊrt. Som oftest gikk oppgraderingen knirkefritt. IT-spesialister pÄ stedet installerte det nye utstyret, migrerte dataene, og virksomheten fortsatte. Bortsett fra nÄr det ikke skjedde. Da det skjedde, sendte selskapet James, med kallenavnet «RengjÞringspersonen», ut for Ä gjÞre jobben.
Selv om kallenavnet antyder en ond type, er renseren bare en kombinasjon av instruktÞr, installatÞr og jack-of-all-trade. James ville tilbringe noen dager pÄ kundens nettsted for Ä sette sammen alle komponentene, og deretter bruke ytterligere et par dager pÄ Ä lÊre personalet hvordan de skulle bruke det nye systemet, lÞse eventuelle maskinvareproblemer som oppsto og i hovedsak hjelpe programvaren gjennom dens spede begynnelse.
Derfor er det ikke overraskende at James i disse hektiske tidene ankom kontoret om morgenen, og fĂžr han rakk pulten sin, ble han mĂžtt av lederen, fylt med koffein utover det vanlige.
«Jeg er redd du mÄ komme deg til Annapolis i Nova Scotia sÄ fort som mulig. Hele systemet deres er nede, og etter en natt med samarbeid med ingeniÞrene deres, kan vi ikke finne ut hva som har skjedd. Det ser ut som ...» server Nettverket sviktet. Men fÞrst etter at systemet hadde kjÞrt i flere minutter.
â De kom ikke tilbake til det gamle systemet? â James svarte helt alvorlig, selv om han mentalt sperret opp Ăžynene av overraskelse.
â NĂžyaktig: IT-spesialisten deres «endret prioriteringer» og bestemte seg for Ă„ forlate med sin gamle server. James, de installerte systemet pĂ„ seks steder og betalte nettopp for premium-stĂžtte, og virksomheten deres drives nĂ„ som den var pĂ„ 1950-tallet.
James rettet seg litt opp.
- Det er en annen sak. Ok, la oss komme i gang.
Da han ankom Annapolis, var det fÞrste han gjorde Ä finne kundens fÞrste teater som hadde et problem. PÄ kartet tatt pÄ flyplassen sÄ alt greit ut, men omrÄdet rundt Þnsket adresse sÄ mistenkelig ut. Ikke ghetto, men minner om film noir. Da James parkerte ved fortauskanten i sentrum, kom en prostituert bort til ham. Gitt stÞrrelsen pÄ Annapolis, var det mest sannsynlig den eneste i hele byen. Utseendet hennes fÞrte umiddelbart tankene til den berÞmte karakteren som tilbÞd sex for penger pÄ storskjerm. Nei, ikke om Julia Roberts, men om Jon Voight [hentydning til filmen "Midnight Cowboy" - ca. kjÞrefelt].
Etter Ä ha sendt den prostituerte pÄ vei, gikk James pÄ kino. OmrÄdet rundt hadde blitt bedre, men det ga likevel inntrykk av Ä vÊre nedkjÞrt. Ikke at James var for bekymret. Han har vÊrt pÄ elendige steder fÞr. Og dette var Canada, hvor selv ranere er hÞflige nok til Ä si «takk» etter Ä ha tatt lommeboken.
Sideinngangen til kinoen var i en fuktig bakgate. James gikk til dÞren og banket pÄ. Snart knirket det og Äpnet seg litt.
-Er du renholder? â det kom en hes stemme innenfra.
â Ja, det er meg... Jeg kom for Ă„ fikse alt.
James gikk inn i kinolobbyen. Personalet hadde tilsynelatende ikke noe annet valg, og begynte Ă„ dele ut papirbilletter til besĂžkende. Dette gjorde finansiell rapportering vanskelig, enn si mer interessante detaljer. Men personalet hilste James med lettelse og tok ham umiddelbart med til serverrommet.
Ved fÞrste Þyekast var alt bra. James logget pÄ serveren og sjekket de vanlige mistenkelige stedene. Ikke noe problem. Av stor forsiktighet stengte James imidlertid serveren, byttet ut nettverkskortet og rullet tilbake systemet. Hun begynte umiddelbart Ä jobbe for fullt. Personalet begynte Ä selge billetter igjen.
James ringte Mark og informerte ham om situasjonen. Det er ikke vanskelig Ä forestille seg at James kanskje vil holde seg rundt og se om noe uventet skjer. Han gikk ned trappene og begynte Ä spÞrre de ansatte hva som skjedde. Tydeligvis har systemet sluttet Ä fungere. De skrudde den av og pÄ, alt fungerte. Men etter 10 minutter falt systemet av.
Akkurat i dette Þyeblikket skjedde noe lignende. Plutselig begynte billettsystemet Ä kaste feil. Personalet sukket og grep papirbillettene, og James skyndte seg til serverrommet. Alt sÄ bra ut med serveren.
SĂ„ kom en av de ansatte inn.
â Systemet fungerer igjen.
James ble forvirret fordi han ikke hadde gjort noe. Mer presist, ingenting som ville fÄ systemet til Ä fungere. Han logget ut, tok opp telefonen og ringte selskapets stÞttelinje. Snart kom den samme ansatte inn i serverrommet.
â Systemet er nede.
James kikket pÄ serveren. Et interessant og kjent mÞnster av flerfargede former danset pÄ skjermen - kaotisk vridende og sammenflettede rÞr. Vi har alle sett denne skjermspareren pÄ et tidspunkt. Det var vakkert gjengitt og bokstavelig talt hypnotiserende.

James trykket pÄ en knapp og mÞnsteret forsvant. Han skyndte seg til billettkontoret og mÞtte pÄ veien en ansatt som kom tilbake til ham.
â Systemet fungerer igjen.
Hvis du kan gjĂžre en mental facepalm, er det akkurat det James gjorde. Skjermsparer. Den bruker OpenGL. Og derfor, under drift, bruker den alle ressursene til serverprosessoren. Som et resultat avsluttes hvert anrop til serveren med et tidsavbrudd.
James kom tilbake til serverrommet, logget pÄ og erstattet skjermspareren med de vakre rÞrene med en blank skjerm. Det vil si at i stedet for en skjermsparer som bruker 100 % av prosessorressursene, installerte jeg en annen som ikke bruker ressurser. SÄ ventet jeg 10 minutter for Ä sjekke gjetningen min.
Da James ankom neste kino, lurte han pÄ hvordan han skulle forklare manageren sin at han nettopp hadde flÞyet 800 km for Ä slÄ av skjermspareren.
Krasj under en viss fase av mÄnen
Sann historie. En dag oppsto det en programvarefeil som var avhengig av mÄnens fase. Det var en liten rutine som ofte ble brukt i forskjellige MIT-programmer for Ä beregne tilnÊrmingen til mÄnens sanne fase. GLS bygde denne rutinen inn i et LISP-program som, nÄr du skriver en fil, ville sende ut en linje med et tidsstempel pÄ nesten 80 tegn. Det var svÊrt sjelden at den fÞrste linjen i en melding ville ende opp med Ä bli for lang og fÞre til neste linje. Og da programmet senere leste denne filen, forbannet den. Lengden pÄ den fÞrste linjen var avhengig av nÞyaktig dato og klokkeslett, samt lengden pÄ fasespesifikasjonen pÄ tidspunktet tidsstemplet ble skrevet ut. Det vil si at feilen bokstavelig talt var avhengig av mÄnens fase!
FÞrste papirutgave (Steele-1983) inneholdt et eksempel pÄ en slik linje som fÞrte til den beskrevne feilen, men typesetteren "fikset" den. Dette har siden blitt beskrevet som en "mÄnefasefeil".
VÊr imidlertid forsiktig med antagelser. For noen Är siden mÞtte ingeniÞrer fra CERN (European Centre for Nuclear Research) feil i eksperimenter utfÞrt ved Large Electron-Positron Collider. Siden datamaskiner aktivt behandler den enorme mengden data som genereres av denne enheten fÞr de viser resultatet til forskere, spekulerte mange i at programvaren pÄ en eller annen mÄte var fÞlsom for mÄnefasen. Flere desperate ingeniÞrer kom til bunns i sannheten. Feilen oppsto pÄ grunn av en liten endring i geometrien til den 27 km lange ringen pÄ grunn av deformasjonen av jorden under mÄnens passasje! Denne historien har gÄtt inn i fysikkfolklore som "Newtons hevn pÄ partikkelfysikk" og et eksempel pÄ sammenhengen mellom fysikkens enkleste og eldste lover og de mest avanserte vitenskapelige konseptene.
Ă spyle toalettet stopper toget
Den beste maskinvarefeilen jeg noen gang har hÞrt om var pÄ et hÞyhastighetstog i Frankrike. Feilen fÞrte til nÞdbremsing av toget, men kun hvis det var passasjerer om bord. I hvert slikt tilfelle ble toget tatt ut av drift, kontrollert, men ingenting ble funnet. SÄ ble han sendt tilbake til linjen, og han stoppet umiddelbart.
Under en av kontrollene gikk en ingeniÞr som reiste pÄ toget pÄ toalettet. Han vasket snart bort, BOM! NÞdstopp.
IngeniÞren tok kontakt med sjÄfÞren og spurte:
â Hva gjorde du rett fĂžr bremsingen?
- Vel, jeg sakket ned pÄ nedstigningen...
Dette var merkelig, for under normal drift bremser toget ned pÄ nedkjÞringer dusinvis av ganger. Toget gikk videre, og ved neste nedstigning advarte sjÄfÞren:
â Jeg kommer til Ă„ senke farten.
Ingenting skjedde.
â Hva gjorde du under siste bremsing? - spurte sjĂ„fĂžren.
- Vel... jeg var pÄ toalettet...
â Vel, sĂ„ gĂ„ pĂ„ toalettet og gjĂžr det du gjorde nĂ„r vi gĂ„r ned igjen!
IngeniÞren gikk pÄ toalettet, og da sjÄfÞren advarte: «Jeg senker farten», spyla han vannet. SelvfÞlgelig stoppet toget umiddelbart.
NÄ kunne de reprodusere problemet og mÄtte finne Ärsaken.
Etter to minutter la de merke til at motorbremsens fjernkontrollkabel (toget hadde en motor i hver ende) var koblet fra veggen pÄ el-skapet og lÄ pÄ reléet som styrte toalettpluggmagneten... Da reléet ble slÄtt pÄ, skapte det forstyrrelser i bremsekabelen, og systembeskyttelsen mot feil inkluderte rett og slett nÞdbremsing.
Porten som hatet FORTRAN
For noen mÄneder siden la vi merke til at nettverksforbindelsene pÄ fastlandet [dette var pÄ Hawaii] ble veldig, veldig trege. Dette kan vare i 10-15 minutter og sÄ plutselig oppstÄ igjen. Etter en tid klaget min kollega til meg at nettverksforbindelsene pÄ fastlandet generelt virker ikke. Han hadde en FORTRAN-kode som mÄtte kopieres til en maskin pÄ fastlandet, men det kunne den ikke fordi "nettverket ikke holdt opp lenge nok til at FTP-opplastingen ble fullfÞrt."
Ja, det viste seg at nettverksfeil oppsto da en kollega forsÞkte Ä FTP en fil med kildekode i FORTRAN til en maskin pÄ fastlandet. Vi prÞvde Ä arkivere filen: sÄ ble den kopiert problemfritt (men mÄlmaskinen hadde ikke en utpakker, sÄ problemet ble ikke lÞst). Til slutt "delte" vi FORTRAN-koden i veldig smÄ biter og sendte dem en om gangen. De fleste fragmentene ble kopiert uten problemer, men noen fÄ stykker bestod ikke, eller passerte etter mange forsÞk.
Da vi undersÞkte de problematiske passasjene, oppdaget vi at de hadde noe til felles: de inneholdt alle kommentarblokker som begynte og sluttet med linjer bestÄende av stor C (som en kollega foretrakk Ä kommentere i FORTRAN). Vi sendte e-post til nettverkseksperter pÄ fastlandet og ba om hjelp. SelvfÞlgelig Þnsket de Ä se prÞver av filene vÄre som ikke kunne overfÞres via FTP... men brevene vÄre nÄdde dem ikke. Til slutt kom vi opp med en enkel beskrivehvordan ikke-overfÞrbare filer ser ut. Det fungerte :) [TÞr jeg legge til et eksempel pÄ en av de problematiske FORTRAN-kommentarene her? Sannsynligvis ikke verdt det!]
Til slutt klarte vi Ä finne ut av det. En ny gateway ble nylig installert mellom vÄr del av campus og fastlandsnettet. Den hadde ENORME problemer med Ä overfÞre pakker som inneholdt gjentatte biter med store bokstaver C! Bare noen fÄ av disse pakkene kan ta opp alle gatewayressursene og forhindre de fleste andre pakker i Ä komme gjennom. Vi klaget til gatewayprodusenten... og de svarte: «à , ja, du stÄr overfor en feil med gjentatt C! Vi vet allerede om ham." Vi lÞste til slutt problemet ved Ä kjÞpe en ny gateway fra en annen produsent (til fÞrstnevntes forsvar kan manglende evne til Ä overfÞre FORTRAN-programmer vÊre en fordel for noen!).
Harde tider
For noen Är siden, mens jeg jobbet med Ä lage et ETL-system i Perl for Ä redusere kostnadene for fase 40 kliniske studier, trengte jeg Ä behandle rundt 000 1 datoer. To av dem besto ikke prÞven. Dette plaget meg ikke sÄ mye fordi disse datoene ble hentet fra klientleverte data som ofte, skal vi si, var overraskende. Men da jeg sjekket de originale dataene, viste det seg at disse datoene var 2011. januar 1 og 2007. januar 30. Jeg trodde at feilen var inneholdt i programmet jeg nettopp hadde skrevet, men det viste seg at det allerede var XNUMX Är gammel. Dette kan hÞres mystisk ut for de som ikke er kjent med programvareÞkosystemet. PÄ grunn av et annet selskaps langvarige beslutning om Ä tjene penger, betalte min klient meg for Ä fikse en feil som det ene selskapet hadde introdusert ved et uhell og det andre med vilje. For at du skal forstÄ hva jeg snakker om, mÄ jeg snakke om selskapet som la til funksjonen som endte opp med Ä bli en feil, samt noen andre interessante hendelser som bidro til den mystiske feilen jeg fikset.
I de gode gamle dager tilbakestilte Apple-datamaskiner noen ganger spontant datoen til 1. januar 1904. à rsaken var enkel: den brukte en batteridrevet "systemklokke" for Ä holde styr pÄ dato og klokkeslett. Hva skjedde da batteriet dÞde? Datamaskiner begynte Ä spore datoen med antall sekunder siden begynnelsen av en epoke. Med epoke mente vi den opprinnelige referansedatoen, og for Macintosh-er var den 1. januar 1904. Og etter at batteriet dÞde, ble gjeldende dato tilbakestilt til den spesifiserte. Men hvorfor skjedde dette?
Tidligere brukte Apple 32 bits for Ä lagre antall sekunder siden den opprinnelige datoen. En bit kan lagre en av to verdier - 1 eller 0. To biter kan lagre en av fire verdier: 00, 01, 10, 11. Tre biter - en verdi av Ätte: 000, 001, 010, 011, 100 , 101, 110, 111 osv. Og 32 kunne lagre en av 232 verdier, det vil si 4 sekunder. For Apple-datoer tilsvarte dette omtrent 294 Är, sÄ eldre Mac-er kan ikke hÄndtere datoer etter 967. Og hvis systembatteriet dÞr, tilbakestilles datoen til 296 sekunder siden begynnelsen av epoken, og du mÄ stille inn datoen manuelt hver gang du slÄr pÄ datamaskinen (eller til du kjÞper et nytt batteri).
Apples beslutning om Ä lagre datoer som sekunder siden epoken gjorde imidlertid at vi ikke kunne hÄndtere datoer fÞr epoken, noe som fikk vidtrekkende konsekvenser, som vi skal se. Apple introduserte en funksjon, ikke en feil. Dette betydde blant annet at Macintosh-operativsystemet var immun mot «millennium-feilen» (som ikke kunne sies om mange Mac-applikasjoner som hadde egne datosystemer for Ä omgÄ restriksjoner).
GÄ videre. Vi brukte Lotus 1-2-3, IBMs «killer application» som var med pÄ Ä lansere PC-revolusjonen, selv om Apple-datamaskiner hadde VisiCalc, som gjorde den personlige datamaskinen til en suksess. I rettferdighet, hvis 1-2-3 ikke hadde dukket opp, ville PC-er neppe tatt av, og historien til personlige datamaskiner kunne ha utviklet seg veldig annerledes. Lotus 1-2-3 behandlet feil 1900 som et skuddÄr. Da Microsoft ga ut sitt fÞrste regneark, Multiplan, tok det en liten andel av markedet. Og da de lanserte Excel-prosjektet, bestemte de seg for ikke bare Ä kopiere rad- og kolonnenavneskjemaet fra Lotus 1-2-3, men ogsÄ Ä sikre feilkompatibilitet ved bevisst Ä behandle 1900 som et skuddÄr. Dette problemet eksisterer fortsatt i dag. Det vil si at i 1-2-3 var dette en feil, men i Excel var det en bevisst beslutning som sÞrget for at alle 1-2-3 brukere kunne importere tabellene sine til Excel uten Ä endre dataene, selv om de var feil.
Men det var et annet problem. FÞrst ga Microsoft ut Excel for Macintosh, som ikke gjenkjente datoer fÞr 1. januar 1904. Og i Excel ble 1. januar 1900 ansett som begynnelsen pÄ epoken. Derfor gjorde utviklerne en endring slik at programmet deres gjenkjente typen epoke og lagret data i seg selv i samsvar med Þnsket epoke. Microsoft skrev til og med en forklarende artikkel om dette. Og denne avgjÞrelsen fÞrte til feilen min.
ETL-systemet mitt mottok Excel-tabeller fra kunder som ble opprettet for Windows, men de kunne ogsÄ ha blitt opprettet pÄ en Mac. Derfor kunne epoken i tabellen ha vÊrt enten 1. januar 1900 eller 1. januar 1904. Hvordan kan jeg finne det ut? Excel-filformatet viser den nÞdvendige informasjonen, men parseren jeg brukte gjorde ikke det (det gjÞr den nÄ) og antok at du kjente epoken for en bestemt tabell. Jeg kunne sannsynligvis ha brukt mer tid pÄ Ä forstÄ Excels binÊre format og sendt en patch til parseren som har laget den, men jeg hadde mye annet arbeid Ä gjÞre for klienten, sÄ jeg skrev raskt en heuristikk for Ä bestemme epoken. Det var enkelt.
I Excel kan datoen 5. juli 1998 representeres i formatet "07-05-98" (ubrukelig amerikansk system), "5. juli 98", "5. juli 1998", "5-jul-98" eller et annet format, et annet ubrukelig format (ironisk nok var et av formatene min versjon av Excel ikke tilbÞd ISO 8601). I tabellen ble imidlertid den uformaterte datoen lagret som enten "35981" for epoke-1900 eller "34519" for epoke-1904 (tallene representerer antall dager siden epoken). Jeg brukte ganske enkelt en enkel parser for Ä trekke ut Äret fra den formaterte datoen, og brukte deretter Excel-parseren for Ä trekke ut Äret fra den uformaterte datoen. Hvis begge verdiene var forskjellige med 4 Är, visste jeg at jeg brukte et system med epoke-1904.
Hvorfor brukte jeg ikke bare formaterte datoer? Fordi 5. juli 1998 kan formateres som "juli 98" med mÄnedsdagen tapt. Vi mottok tabeller fra sÄ mange selskaper som laget dem pÄ sÄ mange forskjellige mÄter at det var opp til oss (i dette tilfellet, meg) Ä finne ut datoene. Dessuten, hvis Excel fÄr det riktig, sÄ burde vi det ogsÄ!
SÄ kom jeg over 39082. La meg minne deg pÄ at Lotus 1-2-3 ansÄ 1900 som et skuddÄr, og Excel gjentok dette trofast. Og siden dette la til én dag til 1900, kunne mange datoberegningsfunksjoner vÊre feil pÄ akkurat den dagen. Det vil si at 39082 kunne ha vÊrt 1. januar 2011 (pÄ Mac-er) eller 31. desember 2006 (i WindowsHvis «Ärsparseren» min hentet ut Äret 2011 fra den formaterte verdien, var alt i orden. Men siden Excels parser ikke vet hvilken epoke som brukes, bruker den som standard epoke 1900, og returnerer 2006. Applikasjonen min sÄ at forskjellen var 5 Är, ansÄ det som en feil, logget den og returnerte den uformaterte verdien.
For Ă„ komme rundt dette skrev jeg dette (pseudokode):
diff = formatted_year - parsed_year
if 0 == diff
assume 1900 date system
if 4 == diff
assume 1904 date system
if 5 == diff and month is December and day is 31
assume 1904 date system
Og sÄ ble alle 40 000 datoene analysert riktig.
Midt i store utskriftsjobber
PÄ begynnelsen av 1980-tallet jobbet min far i Storage Technology, en nÄ nedlagt avdeling som skapte bÄndstasjoner og pneumatiske systemer for hÞyhastighets bÄndmating.
De redesignet stasjonene slik at de kunne ha én sentral "A"-stasjon koblet til syv "B"-stasjoner, og det lille OS i RAM som kontrollerte "A"-stasjonen kunne delegere lese- og skriveoperasjoner til alle "B"-stasjonene.
Hver gang stasjon "A" ble startet, var det nĂždvendig Ă„ sette inn en diskett i den eksterne stasjonen koblet til "A" for Ă„ laste operativsystemet inn i minnet. Det var ekstremt primitivt: datakraft ble levert av en 8-bits mikrokontroller.
MĂ„lgruppen for slikt utstyr var selskaper med svĂŠrt store datavarehus â banker, butikkjeder osv. â som trengte Ă„ skrive ut mange adresseetiketter eller kontoutskrifter.
En klient hadde et problem. Midt i en utskriftsjobb kan en bestemt stasjon "A" slutte Ä fungere, noe som fÞrer til at hele jobben stopper opp. For Ä gjenopprette driften av stasjonen, mÄtte personalet starte alt pÄ nytt. Og hvis dette skjedde midt i en seks timers oppgave, gikk en enorm mengde dyr datatid tapt og tidsplanen for hele operasjonen ble forstyrret.
Teknikere ble sendt fra Storage Technologies. Men til tross for deres beste innsats, klarte de ikke Ä reprodusere feilen under testforhold: det sÄ ut til Ä skje midt i store utskriftsjobber. Problemet var ikke maskinvaren, de erstattet alt de kunne: RAM, mikrokontroller, diskettstasjon, alle tenkelige deler av bÄndstasjonen - problemet vedvarte.
SĂ„ ringte teknikerne hovedkvarteret og ringte eksperten.
Eksperten tok en stol og en kopp kaffe, satte seg i datarommet â pĂ„ den tiden var det rom dedikert til datamaskiner â og sĂ„ pĂ„ mens personalet sto i kĂž for en stor utskriftsjobb. Eksperten ventet pĂ„ at en svikt skulle oppstĂ„ â og det gjorde den. Alle sĂ„ pĂ„ eksperten, men han ante ikke hvorfor dette skjedde. SĂ„ han beordret at jobben skulle stĂ„ i kĂž igjen, og alle ansatte og teknikere kom tilbake pĂ„ jobb.
Eksperten satte seg igjen i stolen og begynte Ä vente pÄ feil. Det gikk rundt seks timer og feilen skjedde. Eksperten hadde igjen ingen ideer, bortsett fra at alt skjedde i et rom fylt med mennesker. Han beordret at oppdraget skulle startes pÄ nytt, satte seg ned igjen og ventet.
Ved den tredje feilen la eksperten merke til noe. Feilen oppsto da personell byttet bÄnd i en utenlandsk stasjon. Dessuten oppsto feilen sÄ snart en av de ansatte gikk gjennom en bestemt flis pÄ gulvet.
Det hevede gulvet var laget av aluminiumsfliser lagt i en hÞyde pÄ 6 til 8 tommer. Tallrike ledninger fra datamaskiner lÞp under det hevede gulvet for Ä forhindre at noen ved et uhell trÄkket pÄ en viktig kabel. Flisene ble lagt svÊrt tett for Ä hindre at rusk kom inn under det hevede gulvet.
Eksperten innsÄ at en av flisene var deformert. NÄr en ansatt trÄkket pÄ hjÞrnet, gnidd kantene pÄ flisen mot de tilstÞtende flisene. Plastdelene som koblet sammen flisene gned seg ogsÄ med dem, noe som forÄrsaket statiske mikroutladninger som skapte radiofrekvensinterferens.
I dag er RAM mye bedre beskyttet mot radiofrekvensinterferens. Men i de Ärene var det ikke slik. Eksperten innsÄ at denne forstyrrelsen forstyrret minnet, og med det driften av operativsystemet. Han ringte stÞttetjenesten, bestilte nye fliser, monterte dem selv, og problemet forsvant.
Det er hĂžyvann!
Historien fant sted i et serverrom, i fjerde eller femte etasje pÄ et kontor i Portsmouth (tror jeg), i havneomrÄdet.
En dag krasjet Unix-serveren med hoveddatabasen. De startet ham pÄ nytt, men han fortsatte lykkelig Ä falle om og om igjen. Vi bestemte oss for Ä ringe noen fra stÞttetjenesten.
StĂžttefyren... Jeg tror han het Mark, men det spiller ingen rolle... Jeg tror ikke jeg kjenner ham. Det spiller ingen rolle, egentlig. La oss holde oss til Mark, ok? Flott.
SÄ noen timer senere ankom Mark (det er ikke lang vei fra Leeds til Portsmouth, du vet), skrudde pÄ serveren og alt fungerte uten problemer. Typisk jÊvla stÞtte, klienten blir veldig opprÞrt over det. Mark ser gjennom loggfilene og finner ingenting uheldig. SÄ Mark setter seg tilbake pÄ toget (eller hvilken transportmÄte han ankom med, det kunne ha vÊrt en halt ku for alt jeg vet... uansett, det spiller ingen rolle, ok?) og drar tilbake til Leeds, etter Ä ha kastet bort dagen.
Samme kveld krasjer serveren igjen. Historien er den samme... serveren reiser seg ikke. Mark prĂžver Ă„ hjelpe eksternt, men klienten kan ikke starte serveren.
Nok et tog, buss, sitronmarengs eller noe annet dritt, og Mark er tilbake i Portsmouth. Se, serveren starter opp uten problemer! Mirakel. Mark bruker flere timer pÄ Ä sjekke at alt er i orden med operativsystemet eller programvaren og drar til Leeds.
Rundt midt pÄ dagen krasjer serveren (ta det med ro!). Denne gangen virker det rimelig Ä hente inn maskinvarestÞttefolk for Ä erstatte serveren. Men nei, etter ca 10 timer faller den ogsÄ.
Situasjonen gjentok seg i flere dager. Serveren fungerer, krasjer etter ca 10 timer og starter ikke de neste 2 timene. De sjekket kjĂžling, minnelekkasjer, de sjekket alt, men fant ingenting. SĂ„ stoppet krasjene.
Uken gikk bekymringslĂžst... alle var fornĂžyde. Glad til det hele starter igjen. Bildet er det samme. 10 timers arbeid, 2-3 timers nedetid...
Og sÄ sa noen (jeg tror de fortalte meg at denne personen ikke hadde noe med IT Ä gjÞre):
"Det er tidevannet!"
Utropet ble mÞtt med blanke blikk, og noens hÄnd nÞlte sannsynligvis ved sikkerhetsanropsknappen.
"Det slutter Ă„ fungere med tidevannet."
Dette ser ut til Ä vÊre et helt fremmed konsept for IT-stÞttemedarbeidere, som neppe leser Tide Yearbook mens de setter seg ned for kaffe. De forklarte at dette ikke kunne relateres til tidevannet pÄ noen mÄte, fordi serveren hadde fungert i en uke uten feil.
«Siste uke var tidevannet lavt, men denne uken er det hÞyt.»
Litt terminologi for de som ikke har yachtlisens. Tidevannet avhenger av mĂ„nens syklus. Og mens jorden roterer, skaper gravitasjonskraften til solen og mĂ„nen hver 12,5 time en flodbĂžlge. I begynnelsen av den 12,5 timer lange syklusen er det hĂžyvann, midt i syklusen er det flo, og pĂ„ slutten er det hĂžyvann igjen. Men etter hvert som mĂ„nens bane endres, endres ogsĂ„ forskjellen mellom lavvann og hĂžyvann. NĂ„r MĂ„nen er mellom Sola og Jorden eller pĂ„ motsatt side av Jorden (fullmĂ„ne eller ingen mĂ„ne), fĂ„r vi Syzygyn tidevann â det hĂžyeste hĂžyvannet og det laveste lavvannet. Ved halvmĂ„ne fĂ„r vi kvadraturtidevann - det laveste tidevannet. Forskjellen mellom de to ytterpunktene avtar kraftig. MĂ„nesyklusen varer i 28 dager: syzygian - kvadratur - syzygian - kvadratur.
Da teknikerne fikk forklart essensen av tidevannskrefter, tenkte de umiddelbart at de mÄtte ringe politiet. Og ganske logisk. Men det viser seg at fyren hadde rett. To uker tidligere fortÞyde en destroyer ikke langt fra kontoret. Hver gang tidevannet hevet den til en viss hÞyde, havnet skipets radarpost i nivÄ med serverromsgulvet. Og radaren (eller elektronisk krigfÞringsutstyr, eller et annet militÊrt leketÞy) skapte kaos i datamaskinene.
Flyoppdrag for raketten
Jeg fikk i oppgave Ä portere et stort (ca. 400 tusen linjer) rakettoppskytingskontroll- og overvÄkingssystem til nye versjoner av operativsystemet, kompilatoren og sprÄket. Mer presist, fra Solaris 2.5.1 til Solaris 7, og fra Verdix Ada Development System (VADS), skrevet i Ada 83, til Rational Apex Ada-systemet, skrevet i Ada 95. VADS ble kjÞpt av Rational, og produktet ble foreldet, selv om Rational prÞvde Ä implementere kompatible versjoner av VADS-spesifikke pakker for Ä lette overgangen til Apex-kompilatoren.
Tre personer hjalp meg med Ä fÄ koden kompilert rent. Det tok to uker. Og sÄ jobbet jeg pÄ egenhÄnd for Ä fÄ systemet til Ä fungere. Kort sagt, det var den verste arkitekturen og implementeringen av et programvaresystem jeg hadde mÞtt, sÄ det tok ytterligere to mÄneder Ä fullfÞre porten. Systemet ble deretter sendt inn for testing, noe som tok flere mÄneder. Jeg korrigerte umiddelbart feilene som ble funnet under testing, men antallet ble raskt redusert (kildekoden var et produksjonssystem, sÄ funksjonaliteten fungerte ganske pÄlitelig, jeg mÄtte bare fjerne feilene som oppsto under tilpasningen til den nye kompilatoren). Til slutt, da alt fungerte som det skulle, ble jeg overfÞrt til et annet prosjekt.
Og fredagen fĂžr Thanksgiving ringte telefonen.
Rakettoppskytningen skulle testes om omtrent tre uker, og under laboratorietester av nedtellingen ble kommandosekvensen blokkert. I det virkelige liv ville dette avbrutt testen, og hvis blokkeringen skjedde innen noen fĂ„ sekunder etter start av motoren, ville det oppstĂ„ flere irreversible handlinger i hjelpesystemene, noe som ville kreve en lang â og kostbar â beredskap av raketten. Det ville ikke ha startet, men mange mennesker ville ha blitt veldig opprĂžrt over tapet av tid og mye, mye penger. Ikke la noen fortelle deg at forsvarsdepartementet bruker penger hensynslĂžst â jeg har aldri mĂžtt en kontraktssjef som ikke satte budsjettet fĂžrst eller andre, etterfulgt av tidsplan.
I tidligere mÄneder hadde denne nedtellingsutfordringen blitt kjÞrt hundrevis av ganger i mange varianter, med bare noen fÄ mindre hikke. SÄ sannsynligheten for at dette skulle skje var svÊrt lav, men konsekvensene var svÊrt betydelige. Multipliser begge disse faktorene, og du vil forstÄ at nyhetene spÄdde en Þdelagt ferieuke for meg og dusinvis av ingeniÞrer og ledere.
Og oppmerksomhet ble rettet mot meg som personen som porterte systemet.
Som med de fleste sikkerhetskritiske systemer ble mange parametere logget, sÄ det var ganske enkelt Ä identifisere de fÄ kodelinjene som ble utfÞrt fÞr systemet krasjet. Og selvfÞlgelig var det absolutt ingenting uvanlig med dem; de samme uttrykkene hadde blitt henrettet tusenvis av ganger i lÞpet av samme lÞp.
Vi kalte folk fra Apex inn i Rational fordi det var de som utviklet kompilatoren og noen av rutinene de utviklet ble kalt inn i den mistenkelige koden. De (og alle andre) var imponert over at det var behov for Ă„ komme til roten av et problem av bokstavelig talt nasjonal betydning.
Siden det ikke var noe interessant i journalene, bestemte vi oss for Ä prÞve Ä reprodusere problemet i et lokalt laboratorium. Dette var ikke en lett oppgave siden hendelsen skjedde omtrent en gang per 1000 lÞp. En mistenkt Ärsak var at et kall til en leverandÞrutviklet mutex-funksjon (del av VADS-migreringspakken) Unlock fÞrte ikke til opplÄsing. BehandlingstrÄden som kalte funksjonen behandlet hjerteslagmeldinger, som nominelt ankom hvert sekund. Vi hevet frekvensen til 10 Hz, det vil si 10 ganger i sekundet, og begynte Ä lÞpe. Omtrent en time senere lÄste systemet seg selv. I loggen sÄ vi at sekvensen av innspilte meldinger var den samme som under den mislykkede testen. Vi kjÞrte flere lÞp, systemet ble konsekvent blokkert 45-90 minutter etter start, og hver gang inneholdt loggen samme rute. Selv om vi teknisk sett kjÞrte forskjellig kode - meldingsfrekvensen var forskjellig - var oppfÞrselen til systemet den samme, sÄ vi var sikre pÄ at dette belastningsscenarioet forÄrsaket det samme problemet.
NĂ„ trengte vi Ă„ finne ut hvor nĂžyaktig blokkeringen skjedde i sekvensen av uttrykk.
Denne implementeringen av systemet brukte Ada-oppgavesystemet, og brukte det utrolig dÄrlig. Oppgaver er en samtidig kjÞrbar konstruksjon pÄ hÞyt nivÄ i Ada, noe sÄnt som utfÞrelsestrÄder, bare innebygd i selve sprÄket. NÄr to oppgaver mÄ kommunisere, "sett et mÞte", utveksler de nÞdvendige data, og stopper deretter mÞtet og gÄr tilbake til sine uavhengige henrettelser. Systemet ble imidlertid implementert annerledes. Etter at en mÄloppgave var rendezvous, mÞttes den mÄloppgaven med en annen oppgave, som deretter mÞttes med en tredje oppgave, og sÄ videre til en viss behandling var fullfÞrt. Etter dette ble alle disse mÞtene fullfÞrt og hver oppgave mÄtte gÄ tilbake til utfÞrelsen. Det vil si at vi hadde Ä gjÞre med det dyreste funksjonsanropssystemet i verden, som stoppet hele "multitasking"-prosessen mens det behandlet deler av inndataene. Og fÞr dette ikke fÞrte til problemer bare fordi gjennomstrÞmningen var veldig lav.
Jeg beskrev denne oppgavemekanismen fordi nÄr et mÞte ble bedt om eller forventet Ä fullfÞre, kunne en "oppgavebytte" oppstÄ. Det vil si at prosessoren kan begynne Ä behandle en annen oppgave som er klar til Ä utfÞres. Det viser seg at nÄr en oppgave er klar til Ä mÞte med en annen oppgave, kan en helt annen oppgave begynne Ä utfÞre, og til slutt gÄr kontrollen tilbake til det fÞrste mÞtet. Og andre hendelser kan oppstÄ som fÄr oppgaven til Ä bytte; en slik hendelse er et kall til en systemfunksjon, for eksempel Ä skrive ut eller utfÞre en mutex.
For Ä forstÄ hvilken kodelinje som forÄrsaket problemet, trengte jeg Ä finne en mÄte Ä registrere fremdrift gjennom en sekvens av utsagn uten Ä utlÞse en oppgavebryter, noe som ville forhindre at en krasj oppsto. SÄ jeg kunne ikke utnytte det Put_Line()for Ä unngÄ Ä utfÞre I/O-operasjoner. Jeg kunne angi en tellervariabel eller noe lignende, men hvordan kan jeg se verdien hvis jeg ikke kan vise den pÄ skjermen?
OgsÄ, nÄr man undersÞkte loggen, viste det seg at til tross for frysingen i behandlingen av hjerteslagmeldinger, som blokkerte alle I/O-operasjoner i prosessen og forhindret annen behandling fra Ä bli utfÞrt, fortsatte andre uavhengige oppgaver Ä bli utfÞrt. Det vil si at arbeidet ikke ble blokkert helt, kun en (kritisk) kjede av oppgaver.
Dette var ledetrÄden som trengs for Ä evaluere det blokkerende uttrykket.
Jeg laget en Ada-pakke som inneholdt en oppgave, en opplistet type og en global variabel av den typen. Tallrike bokstaver var bundet til spesifikke uttrykk for den problematiske sekvensen (f. Incrementing_Buffer_Index, Locking_Mutex, Mutex_Unlocked), og satte deretter inn tilordningsuttrykk som tilordnet den tilsvarende opptellingen til en global variabel. Siden objektkoden til alt dette ganske enkelt lagret en konstant i minnet, var oppgavebytte som et resultat av utfÞrelsen ekstremt usannsynlig. Vi var fÞrst og fremst mistenksomme overfor uttrykk som kunne bytte oppgaven, siden blokkeringen skjedde ved utfÞrelse i stedet for Ä returnere nÄr oppgaven byttes tilbake (av flere grunner).
Sporingsoppgaven kjÞrte ganske enkelt i en slÞyfe og sjekket med jevne mellomrom for Ä se om verdien til den globale variabelen hadde endret seg. Med hver endring ble verdien lagret i en fil. SÄ en kort ventetid og en ny sjekk. Jeg skrev variabelen til filen fordi oppgaven bare ble utfÞrt nÄr systemet valgte den for kjÞring nÄr oppgaven byttes i problemomrÄdet. Uansett hva som skjedde i denne oppgaven ville ikke pÄvirke andre, urelaterte blokkerte oppgaver.
Det var forventet at nÄr systemet nÄdde punktet for Ä kjÞre den problematiske koden, ville den globale variabelen bli tilbakestilt nÄr man flytter til hvert neste uttrykk. Da vil det skje noe som fÄr oppgaven til Ä bytte, og siden dens utfÞrelsesfrekvens (10 Hz) er lavere enn overvÄkingsoppgaven, kan monitoren fange opp verdien av den globale variabelen og skrive den. I en normal situasjon kunne jeg fÄ en repeterende sekvens av en undergruppe av oppregninger: de siste verdiene av variabelen pÄ tidspunktet for oppgavebyttet. Ved henging skal den globale variabelen ikke lenger endres, og den siste verdien som er skrevet vil indikere hvilket uttrykk som ikke fullfÞrte.
Jeg kjÞrte koden med sporing. Han frÞs. Og overvÄkingen fungerte som smurt.
Loggen inneholdt den forventede sekvensen, som ble avbrutt av en verdi som indikerte at en mutex var blitt kalt Unlock, og oppgaven er ikke fullfĂžrt - slik tilfellet er med tusenvis av tidligere samtaler.
Apex-ingeniÞrer analyserte febrilsk koden deres pÄ dette tidspunktet og fant et sted i mutexen hvor det teoretisk sett kunne oppstÄ en lÄsing. Men sannsynligheten var veldig lav, siden bare en viss sekvens av hendelser som skjedde pÄ et bestemt tidspunkt kunne fÞre til blokkering. Murphys lov, folkens, det er Murphys lov.
For Ä beskytte koden jeg trengte, erstattet jeg mutex-funksjonskallene (bygget pÄ toppen av OS-mutex-funksjonaliteten) med en liten innebygd Ada mutex-pakke for Ä kontrollere mutex-tilgangen til den delen.
Jeg satte den inn i koden og kjĂžrte testen. Syv timer senere fungerte koden fortsatt.
Koden min ble sendt til Rational, hvor de kompilerte den, demonterte den og sjekket at den ikke brukte samme tilnĂŠrming som ble brukt i de problematiske mutex-funksjonene.
Dette var den mest overfylte kodegjennomgangen i karrieren min đ Det var rundt ti ingeniĂžrer og ledere i rommet med meg, ytterligere ti personer var pĂ„ en telefonkonferanse - og de undersĂžkte alle rundt 20 linjer med kode.
Koden ble gjennomgÄtt, nye kjÞrbare filer ble satt sammen og sendt inn for formell regresjonstesting. Et par uker senere var nedtellingstesten vellykket og raketten lettet.
Ok, det er vel og bra, men hva er poenget med historien?
Det var et helt ekkelt problem. Hundretusenvis av linjer med kode, parallell kjÞring, over et dusin samspillende prosesser, dÄrlig arkitektur og dÄrlig implementering, grensesnitt for innebygde systemer og millioner av dollar brukt. Ikke noe press, ikke sant.
Jeg var ikke den eneste som jobbet med dette problemet, selv om jeg var i sÞkelyset mens jeg gjorde porteringen. Men selv om jeg gjorde det, betyr ikke det at jeg forsto alle de hundretusenvis av kodelinjene, eller til og med skummet dem. Koden og loggene ble analysert av ingeniÞrer over hele landet, men da de fortalte meg sine hypoteser om Ärsakene til feilen, tok det meg bare et halvt minutt Ä tilbakevise dem. Og nÄr jeg ble bedt om Ä analysere teorier, ville jeg gi det videre til noen andre, fordi det var Äpenbart for meg at disse ingeniÞrene gikk feil vei. HÞres overmodig ut? Ja, dette er sant, men jeg avviste hypotesene og forespÞrslene av en annen grunn.
Jeg forsto problemets natur. Jeg visste ikke nĂžyaktig hvor det skjedde eller hvorfor, men jeg visste hva som skjedde.
Gjennom Ärene har jeg samlet mye kunnskap og erfaring. Jeg var en av pionerene med Ä bruke Ada og forsto fordelene og ulempene. Jeg vet hvordan Ada runtime-bibliotekene hÄndterer oppgaver og hÄndterer parallell kjÞring. Og jeg forstÄr lavnivÄprogrammering pÄ nivÄ med minne, registre og assembler. Jeg har med andre ord dyp kunnskap innen mitt fagfelt. Og jeg brukte dem til Ä finne Ärsaken til problemet. Jeg jobbet ikke bare rundt feilen, jeg forsto hvordan jeg kunne finne den i et veldig sensitivt kjÞretidsmiljÞ.
Slike historier om kamp med kode er ikke sÊrlig interessante for de som ikke er kjent med funksjonene og betingelsene for en slik kamp. Men disse historiene hjelper oss Ä forstÄ hva som skal til for Ä lÞse virkelig vanskelige problemer.
For Ä lÞse virkelig vanskelige problemer, mÄ du vÊre mer enn bare en programmerer. Du mÄ forstÄ "skjebnen" til koden, hvordan den samhandler med miljÞet og hvordan miljÞet i seg selv fungerer.
Og sÄ fÄr du din egen Þdelagte ferieuke.
Skal viderefĂžres.
Kilde: www.habr.com
