8

这个问题几乎概括了它。“dtrace 'print an associative array'” 只在谷歌上出现了一次,类似的搜索同样没用。

编辑:

如果我要使用聚合,我不知道我仍然能够删除条目。我的应用程序要求我能够执行以下操作:

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

...
...


file_descriptors[3] = 0

...
...

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

我知道您可以清除整个聚合,但是单个条目呢?

更新:

由于我在 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...

糟透了。我真的很想拥有更好的东西。

4

2 回答 2

1

这是谷歌找到的链接吗因为这个建议看起来很合理:

我认为您正在寻找的效果应该通过使用聚合而不是数组来实现。所以你实际上会做类似的事情:

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

... 接着:

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

    /* Nuke the requests aggregation */
    trunc(@requests);
}
于 2010-02-23T20:21:15.797 回答
0

Use an associative array and sum(1) and sum(-1) instead of count().

于 2014-04-29T22:12:30.017 回答