2010-12-01 7 views
1

J'ai un script qui exécute mes tests unitaires en utilisant valgrind. Maintenant le script est devenu grand, parce que j'ai peut-être 10 fichiers de suppression (un par bibliothèque), et il est possible que je devrais ajouter plus de fichiers de suppressions.valgrind: Ouvrir plusieurs fichiers de suppression en même temps

Maintenant, au lieu d'avoir une ligne comme celle-ci:

MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/suppression_stdlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_cg.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glut.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_xlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glibc.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_qt.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sdl.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_magick.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sqlite.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_ld.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_selinux.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_opengl.supp" 

J'ai essayé de faire comme ceci:

MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/*.supp" 

mais a besoin valgrind un nom de fichier (n'accepte pas le asterix).

Puisque je fais ceci dans un script bash, quelqu'un peut-il me dire quelle est la manière la plus facile de former cette ligne?

Je pensais à la liste de tous les fichiers dans le répertoire de suppression, puis itérer sur cette liste, et en ajoutant le préfixe --suppressions=.

EDIT

J'ai oublié de demander. C'est ce que j'ai jusqu'à présent:

ALL_SUPPRESION_FILES=`ls $SUPPRESSION_FILES_DIR/*.supp` 

mais je ne trouve pas comment transférer cela dans un tableau. Quelqu'un peut-il aider?

Répondre

3

suffit de le faire de cette façon:

# form the list of suppression files to pass to the valgrind 
VALGRIND_SUPPRESSION_FILES_LIST="" 
for SUPPRESSION_FILE in $SUPPRESSION_FILES_DIR/*.supp; do 
    VALGRIND_SUPPRESSION_FILES_LIST+=" --suppressions=$SUPPRESSION_FILE" 
done 

Il n'y a pas besoin de ls.

est ici un moyen de le faire sans une boucle:

array=($SUPPRESSION_FILES_DIR/*.supp) 
VALGRIND_SUPPRESSION_FILES_LIST=${array[@]/#/--suppressions=} 

Aucune de ces travaux correctement si les noms de fichiers contiennent des espaces, mais des mesures supplémentaires peuvent prendre soin de cela.

+0

Fonctionne très bien. Je vous remercie –

0

Eh bien, je suis parvenu à résoudre le problème de cette façon:

# form the list of suppression files to pass to the valgrind 
ALL_SUPPRESION_FILES=`ls $SUPPRESSION_FILES_DIR/*.supp` 
VALGRIND_SUPPRESSION_FILES_LIST="" 
for SUPPRESSION_FILE in ${ALL_SUPPRESION_FILES[@]}; do 
    VALGRIND_SUPPRESSION_FILES_LIST="$VALGRIND_SUPPRESSION_FILES_LIST --suppressions=$SUPPRESSION_FILE" 
done 

je tokenizing strings et concanating strings pour former la liste.

+0

comment accomplir cela à partir de la ligne de commande, sans utiliser de script. J'ai essayé valgrind --suppressions = "file1.supp, file2.supp" ./exec mais cela ne fonctionne pas –

+0

@PriteshAcharya Voir la [question] (http://stackoverflow.com/q/4326086/476681). Vous devez mettre l'option suppressions par fichier. Dans votre cas 'valgrind --suppressions = fichier1.supp --suppressions = fichier2.supp./Exec' –

Questions connexes