![如何在bpftrace中获取argv[0]?](https://linux22.com/image/224683/%E5%A6%82%E4%BD%95%E5%9C%A8bpftrace%E4%B8%AD%E8%8E%B7%E5%8F%96argv%5B0%5D%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
,表达式指的是指针(地址)本身,而不是它指向的字符串。