Hi Chris,

Scratch space is only valid for the duration of a clause so
the scratch space you had the alias pointers in is most likely
getting trashed by the copyinstr(). You need to stash the pointers
away in something more permanent if you want to access them
at a later time.

Jon.

> Dtracing gethostbyname I'm trying to read the h_alias array and all the 
> entries it points to however every time I copyin an entry pointed to by the 
> first entry in teh h_alias array the other entries in the array get corrupted.
>
> So I have ended up with this script:
>
> #!/usr/bin/dtrace -CZs 
>
> #include <netdb.h>
>
> pid$target::gethostbyname_r:return
> {
>       self->r = (struct hostent *)copyin(arg1, sizeof (struct hostent));
>       printf("%d Host: %s", pid, copyinstr((uintptr_t)self->r->h_name));
>       printf(" h_aliases %p ", self->r->h_aliases);
>       self->a = (char **)copyin((uintptr_t)self->r->h_aliases,
>               4*sizeof (char *));
> }
> #define ALIAS(X) \
> pid$target::gethostbyname_r:return \
> / self->a[X] != 0 / \
> { \
>       printf("%d h_alias[%d]: %p", pid, X, (uintptr_t)(self->a[X])); \
>       self->my_counter++; \
> }
>
> #define XSALIAS(X) 
> #define SALIAS(X) \
> pid$target::gethostbyname_r:return \
> / self->a[X] != 0 / \
> { \
>       printf(" X+1 %p\n", self->a[X+1]); \
>       printf("%d h_alias[%d]: %s", pid, X, \
>                copyinstr((uintptr_t)self->a[X])); \
>       printf("\nX %p", self->a[X]); \
>       printf(" X+1 %p", self->a[X+1]); \
>       self->my_counter--; \
> }
>
> ALIAS(0)
> ALIAS(1)
> ALIAS(2)
> ALIAS(3)
>
> SALIAS(0)
> SALIAS(1)
> SALIAS(2)
> SALIAS(3)
>
> pid$target::gethostbyname_r:return
> /self->my_counter/
> {
>       printf("Stopping...\n");
>       stop(); exit(0);
> }
>
> /* END OF SCRIPT */
>
> This should print out the array of (upto 4) pointers to h_aliases and then 
> dereference each one. However if it fails to derefrence them is stops the 
> target program and exits.  
>
> : va64-v40zh-gmp03.eu TS 14 $; getent hosts va64-v40zh-gmp03
> 129.156.213.204 va64-v40zh-gmp03 loghost spamhost
> : va64-v40zh-gmp03.eu TS 15 $; pfexec /usr/sbin/dtrace -32 -wZCs gethostbynam>
> dtrace: script 'gethostbyname.d' matched 0 probes
> dtrace: allowing destructive actions
> CPU     ID                    FUNCTION:NAME
>   0  55085           gethostbyname_r:return 4489 Host: va64-v40zh-gmp03 
> h_aliases 80646ac 
>   0  55085           gethostbyname_r:return 4489 h_alias[0]: 80667a3
>   0  55085           gethostbyname_r:return 4489 h_alias[1]: 806679a
>   0  55085           gethostbyname_r:return  0+1 806679a
> 4489 h_alias[0]: loghost
> X 0 0+1 0
>   0  55085           gethostbyname_r:return Stopping...
>
>
> : va64-v40zh-gmp03.eu TS 16 $; mdb -p 4489
> Loading modules: [ ld.so.1 libc.so.1 ]
>   
>> 80646ac/4X
>>     
> 0x80646ac:      80667a3         806679a         0               0
>   
>> 80667a3/s
>>     
> 0x80667a3:      loghost
>   
>> 806679a/s
>>     
> 0x806679a:      spamhost
>   
>
> >From the debugging bits I have added to the SALIAS macro it appear that the 
> >copyinstr is causing the values in self->a[X] and self->a[X+1] to be zerod 
> >but why?
>
>
> --
> This message posted from opensolaris.org
> _______________________________________________
> dtrace-discuss mailing list
> [email protected]
>   

_______________________________________________
dtrace-discuss mailing list
[email protected]

Reply via email to