매우 간단한 스크립트가 있습니다.
#!/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
표현식은 가리키는 문자열이 아니라 포인터(주소) 자체를 참조합니다.