perf trace: Beautify pid_t arguments
When reading the syscall tracepoint /format file, look for arguments of type "pid_t" and attach the PID beautifier, that will do a lookup on the threads it knows, i.e. the ones that came from PERF_RECORD_COMM events and add the COMM after the pid in such args: Excerpt of a system wide trace for syscalls with pid_t args: 55602.977 ( 0.006 ms): bash/12122 setpgid(pid: 24347 (bash), pgid: 24347 (bash)) = 0 55603.024 ( 0.004 ms): bash/24347 setpgid(pid: 24347 (bash), pgid: 24347 (bash)) = 0 55691.527 (88.397 ms): bash/12122 wait4(upid: -1, stat_addr: 0x7ffe0cee1720, options: UNTRACED|CONTINUED) ... 55692.479 ( 0.952 ms): git/24347 wait4(upid: 24368, stat_addr: 0x7ffe030d5724) ... 55694.549 ( 2.070 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4fc10) = 24369 (pre-commit) 55694.575 ( 0.002 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f650, options: NOHANG) = -1 ECHILD No child processes 55695.934 ( 0.010 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f2d0, options: NOHANG) = 24370 (git) 55695.937 ( 0.001 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f2d0, options: NOHANG) = -1 ECHILD No child processes 55717.963 ( 0.000 ms): pre-commit/24371 ... [continued]: wait4()) = 24372 55717.978 (21.468 ms): :24371/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) ... 55718.087 ( 0.109 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) = 24373 (tr) 55718.187 ( 0.096 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4f230) = 24374 (wc) 55718.218 ( 0.002 ms): pre-commit/24371 wait4(upid: -1, stat_addr: 0x7ffc94f4eed0, options: NOHANG) = -1 ECHILD No child processes 55718.367 ( 0.005 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f1d0, options: NOHANG) = 24371 (pre-commit) 55718.369 ( 0.001 ms): pre-commit/24368 wait4(upid: -1, stat_addr: 0x7ffc94f4f1d0, options: NOHANG) = -1 ECHILD No child processes 55741.021 (49.494 ms): git/24347 ... [continued]: wait4()) = 24368 (pre-commit) 74146.427 (18319.601 ms): git/24347 wait4(upid: 24375 (git), stat_addr: 0x7ffe030d6824) ... 74149.036 ( 0.891 ms): bash/24391 wait4(upid: -1, stat_addr: 0x7ffe0cee0560) = 24393 (sed) Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-75yl9hzjhb020iadc81gdj8t@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
c65f10701a
commit
d1d438a3b1
|
@ -112,6 +112,58 @@
|
||||||
# define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */
|
# define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct trace {
|
||||||
|
struct perf_tool tool;
|
||||||
|
struct {
|
||||||
|
int machine;
|
||||||
|
int open_id;
|
||||||
|
} audit;
|
||||||
|
struct {
|
||||||
|
int max;
|
||||||
|
struct syscall *table;
|
||||||
|
struct {
|
||||||
|
struct perf_evsel *sys_enter,
|
||||||
|
*sys_exit;
|
||||||
|
} events;
|
||||||
|
} syscalls;
|
||||||
|
struct record_opts opts;
|
||||||
|
struct perf_evlist *evlist;
|
||||||
|
struct machine *host;
|
||||||
|
struct thread *current;
|
||||||
|
u64 base_time;
|
||||||
|
FILE *output;
|
||||||
|
unsigned long nr_events;
|
||||||
|
struct strlist *ev_qualifier;
|
||||||
|
struct {
|
||||||
|
size_t nr;
|
||||||
|
int *entries;
|
||||||
|
} ev_qualifier_ids;
|
||||||
|
struct intlist *tid_list;
|
||||||
|
struct intlist *pid_list;
|
||||||
|
struct {
|
||||||
|
size_t nr;
|
||||||
|
pid_t *entries;
|
||||||
|
} filter_pids;
|
||||||
|
double duration_filter;
|
||||||
|
double runtime_ms;
|
||||||
|
struct {
|
||||||
|
u64 vfs_getname,
|
||||||
|
proc_getname;
|
||||||
|
} stats;
|
||||||
|
bool not_ev_qualifier;
|
||||||
|
bool live;
|
||||||
|
bool full_time;
|
||||||
|
bool sched;
|
||||||
|
bool multiple_threads;
|
||||||
|
bool summary;
|
||||||
|
bool summary_only;
|
||||||
|
bool show_comm;
|
||||||
|
bool show_tool_stats;
|
||||||
|
bool trace_syscalls;
|
||||||
|
bool force;
|
||||||
|
bool vfs_getname;
|
||||||
|
int trace_pgfaults;
|
||||||
|
};
|
||||||
|
|
||||||
struct tp_field {
|
struct tp_field {
|
||||||
int offset;
|
int offset;
|
||||||
|
@ -1073,6 +1125,7 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,
|
||||||
.arg_scnprintf = { [arg] = SCA_STRARRAY, }, \
|
.arg_scnprintf = { [arg] = SCA_STRARRAY, }, \
|
||||||
.arg_parm = { [arg] = &strarray__##array, }
|
.arg_parm = { [arg] = &strarray__##array, }
|
||||||
|
|
||||||
|
#include "trace/beauty/pid.c"
|
||||||
#include "trace/beauty/sched_policy.c"
|
#include "trace/beauty/sched_policy.c"
|
||||||
#include "trace/beauty/waitid_options.c"
|
#include "trace/beauty/waitid_options.c"
|
||||||
|
|
||||||
|
@ -1167,6 +1220,7 @@ static struct syscall_fmt {
|
||||||
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
.arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
|
||||||
{ .name = "getitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
{ .name = "getitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
||||||
{ .name = "getpid", .errpid = true, },
|
{ .name = "getpid", .errpid = true, },
|
||||||
|
{ .name = "getpgid", .errpid = true, },
|
||||||
{ .name = "getppid", .errpid = true, },
|
{ .name = "getppid", .errpid = true, },
|
||||||
{ .name = "getrandom", .errmsg = true,
|
{ .name = "getrandom", .errmsg = true,
|
||||||
.arg_scnprintf = { [2] = SCA_GETRANDOM_FLAGS, /* flags */ }, },
|
.arg_scnprintf = { [2] = SCA_GETRANDOM_FLAGS, /* flags */ }, },
|
||||||
|
@ -1328,6 +1382,7 @@ static struct syscall_fmt {
|
||||||
[3] = SCA_MSG_FLAGS, /* flags */ }, },
|
[3] = SCA_MSG_FLAGS, /* flags */ }, },
|
||||||
{ .name = "set_tid_address", .errpid = true, },
|
{ .name = "set_tid_address", .errpid = true, },
|
||||||
{ .name = "setitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
{ .name = "setitimer", .errmsg = true, STRARRAY(0, which, itimers), },
|
||||||
|
{ .name = "setpgid", .errmsg = true, },
|
||||||
{ .name = "setrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
|
{ .name = "setrlimit", .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
|
||||||
{ .name = "setxattr", .errmsg = true,
|
{ .name = "setxattr", .errmsg = true,
|
||||||
.arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
|
.arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
|
||||||
|
@ -1485,59 +1540,6 @@ static struct thread_trace *thread__trace(struct thread *thread, FILE *fp)
|
||||||
|
|
||||||
static const size_t trace__entry_str_size = 2048;
|
static const size_t trace__entry_str_size = 2048;
|
||||||
|
|
||||||
struct trace {
|
|
||||||
struct perf_tool tool;
|
|
||||||
struct {
|
|
||||||
int machine;
|
|
||||||
int open_id;
|
|
||||||
} audit;
|
|
||||||
struct {
|
|
||||||
int max;
|
|
||||||
struct syscall *table;
|
|
||||||
struct {
|
|
||||||
struct perf_evsel *sys_enter,
|
|
||||||
*sys_exit;
|
|
||||||
} events;
|
|
||||||
} syscalls;
|
|
||||||
struct record_opts opts;
|
|
||||||
struct perf_evlist *evlist;
|
|
||||||
struct machine *host;
|
|
||||||
struct thread *current;
|
|
||||||
u64 base_time;
|
|
||||||
FILE *output;
|
|
||||||
unsigned long nr_events;
|
|
||||||
struct strlist *ev_qualifier;
|
|
||||||
struct {
|
|
||||||
size_t nr;
|
|
||||||
int *entries;
|
|
||||||
} ev_qualifier_ids;
|
|
||||||
struct intlist *tid_list;
|
|
||||||
struct intlist *pid_list;
|
|
||||||
struct {
|
|
||||||
size_t nr;
|
|
||||||
pid_t *entries;
|
|
||||||
} filter_pids;
|
|
||||||
double duration_filter;
|
|
||||||
double runtime_ms;
|
|
||||||
struct {
|
|
||||||
u64 vfs_getname,
|
|
||||||
proc_getname;
|
|
||||||
} stats;
|
|
||||||
bool not_ev_qualifier;
|
|
||||||
bool live;
|
|
||||||
bool full_time;
|
|
||||||
bool sched;
|
|
||||||
bool multiple_threads;
|
|
||||||
bool summary;
|
|
||||||
bool summary_only;
|
|
||||||
bool show_comm;
|
|
||||||
bool show_tool_stats;
|
|
||||||
bool trace_syscalls;
|
|
||||||
bool force;
|
|
||||||
bool vfs_getname;
|
|
||||||
int trace_pgfaults;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname)
|
static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname)
|
||||||
{
|
{
|
||||||
struct thread_trace *ttrace = thread__priv(thread);
|
struct thread_trace *ttrace = thread__priv(thread);
|
||||||
|
@ -1763,6 +1765,8 @@ static int syscall__set_arg_fmts(struct syscall *sc)
|
||||||
sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx];
|
sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx];
|
||||||
else if (field->flags & FIELD_IS_POINTER)
|
else if (field->flags & FIELD_IS_POINTER)
|
||||||
sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex;
|
sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex;
|
||||||
|
else if (strcmp(field->type, "pid_t") == 0)
|
||||||
|
sc->arg_scnprintf[idx] = SCA_PID;
|
||||||
++idx;
|
++idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
static size_t syscall_arg__scnprintf_pid(char *bf, size_t size, struct syscall_arg *arg)
|
||||||
|
{
|
||||||
|
int pid = arg->val;
|
||||||
|
struct trace *trace = arg->trace;
|
||||||
|
size_t printed = scnprintf(bf, size, "%d", pid);
|
||||||
|
struct thread *thread = machine__find_thread(trace->host, pid, pid);
|
||||||
|
|
||||||
|
if (thread != NULL) {
|
||||||
|
if (thread->comm_set)
|
||||||
|
printed += scnprintf(bf + printed, size - printed,
|
||||||
|
" (%s)", thread__comm_str(thread));
|
||||||
|
thread__put(thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
return printed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SCA_PID syscall_arg__scnprintf_pid
|
Loading…
Reference in New Issue