2010-02-23 8 views
7

Die Frage fasst es ziemlich zusammen. "dtrace 'druckt ein assoziatives Array'" hat genau einen Google-Treffer und die ähnlichen Suchanfragen sind ebenfalls nutzlos.Wie druckst du ein assoziatives Array in Dtrace?

EDIT:

Wenn ich eine Aggregation verwenden war, ich bin mir nicht bewusst, dass ich noch in der Lage sein würde Einträge zu entfernen. Meine Anwendung erfordert, dass ich in der Lage sein, die Dinge zu tun, wie:

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. 

Ich weiß, dass Sie eine ganze Aggregation löschen kann, aber was ist mit einem einzigen Eintrag?

UPDATE:

Da ich dies in OS X mache und meine Anwendung ist alle der Datei-Deskriptoren zu verfolgen, die von einem bestimmten Prozess geöffnet wurden, konnte ich ein Array von 256 haben Pfadnamen, so:

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

Es saugt. Ich möchte wirklich etwas besseres haben.

Antwort

1

Ist this der Link Google gefunden? Da der Rat recht Sound scheint:

Ich denke, die Wirkung Sie suchen sollten eher durch die Verwendung eines Aggregation erreicht werden als ein Array. Also würde man tatsächlich so etwas wie tun:

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

... und dann:

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

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

Können Sie einen einzelnen Eintrag in einer Aggregation löschen? – Sniggerfardimungus

+0

Oh - ich sehe jetzt, was du tust. Aggregationen sind nicht das, was Sie wollen, es sei denn, Sie sammeln eine Menge Daten über den Lauf für diesen Schlüssel. Es tut uns leid; Ich habe es falsch verstanden. – Don

+0

Kein Problem. Das Problem ist ein bisschen eine harte Nuss zu knacken und ich hätte klarer in meinem Beitrag sein können ... – Sniggerfardimungus

0

Verwendung eines assoziativen Arrays und sum(1) und sum(-1) statt count().