2010-02-23 7 views
7

La question résume à peu près tout. "dtrace 'imprimer un tableau associatif" "a exactement un google hit et les recherches similaires sont également inutiles.Comment imprimer un tableau associatif dans dtrace?

EDIT:

Si je devais utiliser une agrégation, je ne sais pas que je serais encore capable de supprimer les entrées. Mon application exige que je sois capable de faire des choses comme:

file_descriptors[0] = "stdin" 
file_descriptors[3] = "service.log" 

... 
... 


file_descriptors[3] = 0 

... 
... 

print_array(file_descriptors) # should print only those entries that have not been cleared. 

Je sais que vous pouvez effacer une agrégation entière, mais qu'en est-une seule entrée?

MISE À JOUR:

Depuis que je suis en train de faire cela dans OS X et mon application est de suivre tous les descripteurs de fichiers qui ont été ouverts par un processus particulier, je suis en mesure d'avoir un tableau de 256 pathnames, donc:

syscall::open*:entry 
/execname == $1/ 
{ 
    self->path = copyinstr(arg0); 
} 

syscall::open*:return 
/execname == $1/ 
{  
    opened[arg0] = self->path; 
} 

syscall::close*:entry 
/execname == $1/ 
{ 
    opened[arg0] = 0; 
} 

tick-10sec 
{ 
    printf(" 0: %s\n", opened[0]); 
} 

The above probe repeated 255 more times... 

Il suce. J'aimerais vraiment avoir quelque chose de mieux.

Répondre

1

Le lien trouvé par Google est-il this? Parce que le conseil semble assez solide:

Je pense que l'effet que vous êtes à la recherche devrait être réalisé en utilisant une agrégation plutôt qu'un tableau. Alors vous feriez réellement faire quelque chose comme:

@requests[remote_ip,request] = count(); 

... puis:

profile:::tick-10sec 
{ 
    /* print all of the requests */ 
    printa(@requests); 

    /* Nuke the requests aggregation */ 
    trunc(@requests); 
} 
+0

Pouvez-vous effacer une seule entrée dans une agrégation? – Sniggerfardimungus

+0

Oh - Je vois maintenant ce que tu fais. Les agrégations ne sont pas ce que vous voulez, sauf si vous collectez un tas de données au cours de la course pour cette clé. Pardon; J'ai mal compris. – Don

+0

Pas de problème. Le problème est un peu difficile à résoudre et j'aurais pu être plus clair dans mon message ... – Sniggerfardimungus

0

Utilisez un tableau associatif et sum(1) et sum(-1) au lieu de count().

Questions connexes