Как вы печатаете ассоциативный массив в dtrace? - PullRequest
7 голосов
/ 23 февраля 2010

Вопрос в значительной степени подводит итог. "dtrace 'напечатать ассоциативный массив'" содержит ровно один запрос Google, и подобные поиски одинаково бесполезны.

EDIT:

Если бы я использовал агрегацию, я не знал бы, что я все еще смог бы удалить записи. Мое приложение требует, чтобы я мог делать такие вещи, как:

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.

Я знаю, что вы можете очистить всю совокупность, но как насчет одной записи?

UPDATE:

Поскольку я делаю это в OS X и мое приложение отслеживает все файловые дескрипторы, которые были открыты определенным процессом, я смог получить массив из 256 путей, таким образом:

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

Это отстой. Я действительно хотел бы иметь что-то лучше.

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

Является ли этой ссылкой, найденной Google? Потому что совет кажется довольно здравым:

Я думаю, что эффект, который вы ищете, должен быть достигнут с помощью агрегация, а не массив. Таким образом, вы бы на самом деле сделали что-то вроде:

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

... а затем:

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

    /* Nuke the requests aggregation */
    trunc(@requests);
}
0 голосов
/ 30 апреля 2014

Используйте ассоциативный массив и sum(1) и sum(-1) вместо count().

...