![bpftraceでargv [0]を取得する方法は?](https://linux33.com/image/224683/bpftrace%E3%81%A7argv%20%5B0%5D%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F.png)
非常に単純なスクリプトがあります。
#!/usr/bin/bpftrace
tracepoint:syscalls:sys_enter_exec*
{
@start[pid] = nsecs;
printf("START;%-6d;", pid);
join(args->argv);
}
tracepoint:syscalls:sys_enter_exit*
{
$from = @start[pid];
$until = nsecs;
printf("STOP;%-5d;%-16d\n", pid, $until-$from);
}
args->argv[0]
私は一般的な複数行よりもそれを印刷したいと思いますjoin(args->argv)
。
問題は、これがうまくprintf("START;%-6d;%s", pid, args->argv[0]);
いかないことです。
/tmp/foo.bt:5:5-48: ERROR: printf: %s specifier expects a value of type string (integer supplied)
printf("START;%-6d;%s", pid, args->argv[0]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
args->argv
文字列配列であることが確実で驚きました。この問題をどのように解決できますか?
答え1
str(args->argv[0])
最後の引数として使用するとprintf
機能します。そうでない場合、str
式は指す文字列ではなく、ポインタ(アドレス)自体を参照します。