/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Reklame: valgrind
Fra : Per Abrahamsen


Dato : 10-03-02 11:10

Hvis du har adgang til en ny Linux (2.4) og programmerer i C eller C++
vil jeg stærk anbefale at du prøver valgrind. Valgrind er et nyt frit
program der checker for memory fejl (out of bound access, leaks,
m.m.). For mit program fandt den et sted jeg brugte "delete" og burde
bruge "delete []", samt et par kilobyte memory der var leaket i
initialiseringen.

Hvad der adskiller valgrind fra de fleste andre lignende systemer er
at man ikke behøver gøre noget specielt når man oversætte sit eget
program. Faktisk så er testen når man har oversat valgrind

./valgrind ls -l

som vil give oplysninger om de 5 memory fejl der er i GNU ls, i hvert
fald i den version der er installeret på min maskine.

Generelt kører du den som

valgrind --valgrind-argumenter dit-program --dine-argumenter

Eneste krav er, så vidt jeg kan se, at "dit-program" er dynamisk
linket. Det er en god ide at oversætte sit program med -g, så får man
nemlig linienumre. Og hvis man ikke bruger -O er linienumrende
rimelig præcise. Men det er ikke nødvendigt, og det er jo rart også
at kunne checke den endelige udgave.

Valgrind virker ved at oprette en "virtuel GNU/Linux", og køre
programmet der. Se

<http://devel-home.kde.org/~sewardj/>

hvor valgrind kan hentes. Lad være med at blive forskrækket over
addressen, der er intet KDE specifikt ved valgrind.



 
 
Byrial Jensen (10-03-2002)
Kommentar
Fra : Byrial Jensen


Dato : 10-03-02 23:45

Per Abrahamsen <abraham@dina.kvl.dk> skrev:
> Hvis du har adgang til en ny Linux (2.4) og programmerer i C eller C++
> vil jeg stærk anbefale at du prøver valgrind. Valgrind er et nyt frit

Ja, valgrind er god. Jeg kan fuldt ud tilslutte mig anbefalingen.
Men man bør tilføje det kun kan køre på Intel x86-arkitektur.

> Eneste krav er, så vidt jeg kan se, at "dit-program" er dynamisk
> linket. Det er en god ide at oversætte sit program med -g, så får man
> nemlig linienumre. Og hvis man ikke bruger -O er linienumrende
> rimelig præcise. Men det er ikke nødvendigt, og det er jo rart også
> at kunne checke den endelige udgave.

Der er nu forskellige begrænsninger. Bl.a. kan trådede programmer
og programmer som bruger MMX, SSE og andre specielle
CPU-instruktioner, (endnu) ikke afvikles af valgrind.

> Valgrind virker ved at oprette en "virtuel GNU/Linux", og køre
> programmet der. Se

Jeg vil snarede sige at det opretter en virtuel CPU som dels
udfører programmet, dels holder øje med al brug af hukommelse og
holder styr på hvilke adresser som der må skrives til, hvilke
adresser der må læses fra, og hvilke bit (ja, bit) som har en
brugbar defineret værdi. Programmet oversættes til den virtuelle
CPU med en JIT-oversætter (Just In Time) efterhånden som det
udføres.

Et eksempel:

$ cat vg.c
#include <stdlib.h>
#include <stdio.h>

int main()
{
unsigned char *cp = malloc (1);

*cp |= '\x0F';

if (*cp & 0xF)
printf ("O.k. - de 4 nederste bit blev sat ovenfor\n");

if (*cp & 0xF0) /* Dette er linje 13 */
printf ("Ups - test af udefinerede bit\n");

return 0;
}
$ gcc -Wall -g vg.c -o vg
[byrial@ask test]$ valgrind ./vg
==1345== valgrind-20020307, a memory error detector for x86 GNU/Linux.
==1345== Copyright (C) 2000-2002, and GNU GPL'd, by Julian Seward.
==1345== For more details, rerun with: -v
==1345==
O.k. - de 4 nederste bit blev sat ovenfor
==1345== Use of uninitialised CPU condition code
==1345== at 0x80484DB: main (vg.c:13)
==1345== by 0x402DB507: __libc_start_main (../sysdeps/generic/libc-start.c:129)
==1345== by 0x80483B1: (within /home/byrial/test/vg)
==1345== by <bogus frame pointer> ???
==1345==
==1345== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==1345== malloc/free: in use at exit: 1 bytes in 1 blocks.
==1345== malloc/free: 1 allocs, 0 frees, 1 bytes allocated.
==1345== For a detailed leak analysis, rerun with: --leak-check=yes
==1345== For counts of detected errors, rerun with: -v
$

Jeg er imponeret!

> <http://devel-home.kde.org/~sewardj/>

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste