Stoppa läckaget

Det är ibland lätt att glömma det jag skulle vilja påstå är tickande bomber när det gäller
både testning och utveckling – minnesläckor!
Testarna kan ibland svära sig fria att minnesläckor då det är inte deras avdelning, det skall utvecklarna ta med white-box verktyg osv. Utvecklarna
kan i sin tur påstå att det inte läcker i de få testfall som de provar. I många fall så gör ingen inget.
Risk för risk så att säga.´
Det finns många sätt att testa minnesallokeringar på. Jag tänkte ge ett exempel hur det kan bli om det finns
ett intresse från både utveckling och testsidan. Vi hade en serverprogramvara där komplexiteten var riktig hög. Att monitora varje testfall
manuellt ansågs kosta alldeles för mycket.
Istället tog utvecklingssidan fram en s.k. instrumenterad server, det var samma server fast med ett bibliotek från m-patrol som hade
koll på minnesallockeringen. Så när servern terminerade så kom det ut prydligt en fil med alla allockeringar som inte hade återlämnats. Efter lite
instrumentering, för vissa allokeringar var helt okay, det var objekt som hade hade skulle instansieras en gång och endast en gång, så de plockades bort och loggades inte. Därav, kom det en fil
så fanns det en anledning att kolla om detta scenario läckte.
Genom vår automattestframework kunde vi köra igenom alla tester och få ut vilka testfall som indikerade läckor. På detta sätt tog vi många läckor,
men långt ifrån alla, då täckningen av automattesterna inte var i tillräcklig nivå. Den instrumerade servern användes flitigt för att hitta läckor även när vi manuellt testade.
Däremot så hade den instrumerade servern ett problem när det gällde testtyper. I funktionstest lämpade den sig bra, men däremot så var det problem med prestandan när vi körde prestandatester. Prestandan
var inte detsamma och servern blev långsammare.
En annan fin sak var att om vi använde oss av debug symboler så kunde vi se exakt i koden var allockeringarna gjordes.
I det fallet fick den gamla fina mätmetoder såsom task managern eller processmonitorn användas istället,om man kör på windows. På unix har vi den gamla vännen “ps” att ta till.
Nu är det inte endast processens private bytes vi behöver ha koll på när vi mäter läckor. “Handles” av olika sort behövs också att ha kontroll över och så trådhanteringen.
Microsoft har ett gammalt fint verktyg “umhd” som kan vara bra att slänga ett getöga på. Jag skrev själv ett användargränsnitt till detta tool en gång i tiden. Umhd är dock lite
trubbigt verktyg, men om ni behöver ett verktyg till windows och har tiden att sätta in Er på djupet så kan det vara värt investeringen.
Så vill man inte bygga in det i sin programvara, vilket kan vara ett problem då man inte testar exakt den version som kommer till kund så finns det varianter
där man kan ha icke processpåverkan. De är inte lika effektiva och enkla men kan vara en lösning.
Så till sist, glöm inte av de tickande bomber som finns där ute i produkterna. Framöver kommer jag publicera en artikel även läckor i webapplikationer, något som verkar vara
ett problem på uppåtgående trend.
Länkar:
1. M-patrol http://mpatrol.sourceforge.net/
2. UMHD http://support.microsoft.com/kb/268343

Det är ibland lätt att glömma det jag skulle vilja påstå är tickande bomber när det gäller både testning och utveckling – minnesläckor!

Testarna kan ibland svära sig fria från minnesläckor då det inte är deras avdelning, det skall utvecklarna ta med white-box verktyg osv. Utvecklarna kan i sin tur påstå att det inte läcker i de få testfall som de provar. I många fall så gör ingen någonting åt detta.

Risk för risk så att säga.

Det finns många sätt att testa minnesallokeringar på. Jag tänkte ge ett exempel hur det kan bli om det finns ett intresse från både utveckling och testsidan. Vi hade en serverprogramvara där komplexiteten var riktig hög. Att monitora varje testfall manuellt ansågs kosta alldeles för mycket.

Istället tog utvecklingssidan fram en s.k. instrumenterad server, det var samma server fast med ett bibliotek från m-patrol som hade koll på minnesallokeringen. Så när servern terminerade så kom det ut en prydlig fil med alla allokeringar som inte hade återlämnats. Efter lite instrumentering av koden så tog vi bort de allokeringar som bara hade instansieras en gång och endast en gång bort, då alla allokeringar inte var läckor.

Därav, kom det en fil  så fanns det en anledning att kolla om detta scenario läckte.

Genom vår automattestframework kunde vi köra igenom alla tester och få ut vilka testfall som indikerade läckor. På detta sätt tog vi många läckor,  men långt ifrån alla, då täckningen av automattesterna inte var i tillräcklig nivå. Den instrumerade servern användes flitigt för att hitta läckor även när vi testade manuellt.

Däremot så hade den instrumerade servern ett problem när det gällde testtyper. I funktionstest lämpade den sig bra, men däremot så var det problem med prestandan när vi körde prestandatester. Prestandan var inte detsamma och servern blev mycket långsammare. Dock när vi väl hittade en misstänkt allokering och hade debug symbolerna till hand så kunde vi se exakt i koden vart allokeringarna gjordes.

I det fallet fick gamla fina mätmetoder såsom task managern eller processmonitorn användas istället,om man kör på windows. På unix har vi den gamla vännen “ps” att ta till. Nu är det inte endast processens private bytes vi behöver ha koll på när vi mäter läckor. “Handles” av olika sort behöver man också att ha kontroll över och så trådhanteringen.

Microsoft har ett gammalt fint verktyg “umhd” som kan vara bra att slänga ett getöga på. Jag skrev själv ett användargränsnitt till detta verktyg en gång i tiden. Umhd är dock ett litet trubbigt verktyg, men om ni behöver ett verktyg till windows och har tiden att sätta in Er på djupet så kan det vara värt investeringen.

Så vill man inte bygga in det i sin programvara, vilket kan vara ett problem då man inte testar exakt den version som kommer till kund så finns det varianter där man kan ha icke processpåverkan. De är inte lika effektiva och enkla men kan vara en lösning.

Nyckeln är att vara med från början och få vara med och påverka kraven, inte bara så att kraven blir testbara utan på att också få in krav som handlar om hur man kan testa produkten bättre.

Så till sist, glöm inte av de tickande bomber som finns där ute i produkterna. Framöver kommer jag publicera en artikel även om läckor i webapplikationer, något som verkar vara en uppåtgående trend och därmed ett problem.

Länkar:

1. M-patrol http://mpatrol.sourceforge.net/

2. UMHD http://support.microsoft.com/kb/268343

About Bengt

Bengt Augustsson Delägare av QualityMinds AB. Grundare av TestAdvance AB. Grundare av TestZonen.se.Medlem i Styrelsen SAST Väst. Bengt började arbeta med kvalitetssäkring och test 1999 och är specialiserad på testledning,testverktyg, testverktygsutveckling samt testautomatisering.