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/>