2011-08-28 3 views
1

Je pense que le cadre d'emballage de valgrind est plutôt sympa. J'essaie de suivre les différences entre les différents chemins de code (pour savoir pourquoi on travaille et pas un autre). Au lieu d'essayer de regarder une différence d'une sortie strace (qui ne me donnera pas tous les détails dont j'ai besoin parce que je veux suivre les appels lib et sys, j'ai décidé d'utiliser des wrappers autour d'une poignée de fonctions.)Emballeuse Valgrind avec varargs?

Ca me gratter la tête est fcntl.

fcntl déclare manpage comme suit

int fcntl(int fd, int cmd); 
int fcntl(int fd, int cmd, long arg); 
int fcntl(int fd, int cmd, struct flock *lock); 

Cependant, comme cela est C et ne surcharge vient pas naturellement à C, il est prototypé comme suit fcntl.h

extern int fcntl (int __fd, int __cmd, ...); 

L'installation d'emballage de l'utilisateur final en nombre valgrind soutient N des arguments de texte, mais porte un avertissement sur l'utilisation du mauvais numéro de args et je ne vois pas de mention d'aucune varargs.

Une fonction varargs plus classique comme printf est généralement implémentée avec une fonction d'argument fixe inférieure vprintf qui prend va_list comme un seul paramètre. Dans un tel cas j'aurais enveloppé vprintf plutôt que printf, mais hélas AFAIK fcntl n'a pas une telle fonction intermédiaire.

Ma question est - à quoi ressemblerait un emballage "sûr" pour fcntl?

Par exemple, le suivant semble au travail, mais est-il sûr:

int I_WRAP_SONAME_FNNAME_ZU(libcZdsoZa,fcntl)(int fd, int cmd, ...) 
{ 
    int result; 
    OrigFn fn; 
    void* arg; 

    va_list argp; 
    va_start(argp, cmd); 
    arg=va_arg(argp, void*); 

    VALGRIND_GET_ORIG_FN(fn); 
    printf("@@fcntl wrapper: args fd=%d, cmd=%d, arg=%p ... ", fd, cmd, arg); 
    CALL_FN_W_WWW(result, fn, fd, cmd, arg); 
    printf("##fcntl wrapper: result %d\n", result); 
    return result; 
} 

Répondre

2

Regard syswrappers pour sys_ioctl dans les sources de valgrind dans le fichier coregrind/m_syswrap/syswrap-linux.c.

Regardez http://valgrind.org/docs/manual/dist.readme-missing.html pour plus de détails. Peut-être aurez-vous besoin de reconstruire valgrind avec vos changements pour syswrappers.