From 928f18a6c02cf1eaafb7b60cb72860ed68d7456b Mon Sep 17 00:00:00 2001 From: Mathieu Bain Date: Tue, 3 Apr 2012 11:10:19 -0400 Subject: [PATCH] statedump_process_state & problems patches Solved some problems Give all the files opened by using the statedump_file_descriptor Give the rigth name to the Unknown process by using the statedump_process_state. [minor edit by jdesfossez to fix a missing const] Signed-off-by: Mathieu Bain Signed-off-by: Julien Desfossez --- src/common.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ src/common.h | 3 +++ src/iostreamtop.c | 30 ++++++++++++--------- src/lttngtop.c | 6 +++++ 4 files changed, 95 insertions(+), 13 deletions(-) diff --git a/src/common.c b/src/common.c index b18eafd..3051f7e 100644 --- a/src/common.c +++ b/src/common.c @@ -462,3 +462,72 @@ struct lttngtop* get_copy_lttngtop(unsigned long start, unsigned long end) return dst; } + +enum bt_cb_ret handle_statedump_process_state(struct bt_ctf_event *call_data, + void *private_data) +{ + const struct definition *scope; + struct processtop *proc; + unsigned long timestamp; + int64_t pid, tid; + char *procname; + + timestamp = bt_ctf_get_timestamp(call_data); + if (timestamp == -1ULL) + goto error; + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + pid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_pid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing pid context info\n"); + goto error; + } + + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + tid = bt_ctf_get_int64(bt_ctf_get_field(call_data, + scope, "_tid")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing tid context info\n"); + goto error; + } + + /* + * FIXME + * I first tried with bt_ctf_get_string but doesn`t work at all + * It couldn`t find the field _name because it is an integer in + * the metadata and not a string like _filename for the + * statedump_file_descriptor + */ + scope = bt_ctf_get_top_level_scope(call_data, + BT_EVENT_FIELDS); + procname = bt_ctf_get_char_array(bt_ctf_get_field(call_data, + scope, "_name")); + if (bt_ctf_field_get_error()) { + fprintf(stderr, "Missing process name context info\n"); + goto error; + } + + proc = find_process_tid(<tngtop, tid, procname); + if (proc == NULL) + proc = add_proc(<tngtop, tid, procname, timestamp); + + free(proc->comm); + proc->comm = strdup(procname); + proc->pid = pid; + + /* + * FIXME + * I would like to free procname because it is duplicated + * when the process is created but it segfaults... + * + * free(procname); + */ + + return BT_CB_OK; + +error: + return BT_CB_ERROR_STOP; +} diff --git a/src/common.h b/src/common.h index 21df7b1..0903413 100644 --- a/src/common.h +++ b/src/common.h @@ -63,4 +63,7 @@ uint64_t get_context_pid(const struct bt_ctf_event *event); uint64_t get_context_ppid(const struct bt_ctf_event *event); char *get_context_comm(const struct bt_ctf_event *event); +enum bt_cb_ret handle_statedump_process_state(struct bt_ctf_event *call_data, + void *private_data); + #endif /* _COMMON_H */ diff --git a/src/iostreamtop.c b/src/iostreamtop.c index 7c1d611..33b9019 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -302,7 +302,8 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, struct processtop *tmp; unsigned long timestamp; uint64_t cpu_id; - int64_t tid, pid; + int64_t tid; + char *procname; int fd; timestamp = bt_ctf_get_timestamp(call_data); @@ -312,7 +313,7 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -323,7 +324,7 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp); tmp->syscall_info = create_syscall_info(__NR_write, cpu_id, tid, fd); insert_file(tmp, fd); @@ -341,7 +342,8 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; - int64_t tid, pid; + int64_t tid; + char *procname; int fd; timestamp = bt_ctf_get_timestamp(call_data); @@ -351,7 +353,7 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -362,7 +364,7 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp); tmp->syscall_info = create_syscall_info(__NR_read, cpu_id, tid, fd); insert_file(tmp, fd); @@ -382,7 +384,8 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, const struct definition *scope; unsigned long timestamp; uint64_t cpu_id; - int64_t tid, pid; + int64_t tid; + char *procname; char *file; timestamp = bt_ctf_get_timestamp(call_data); @@ -392,7 +395,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); cpu_id = get_cpu_id(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -403,7 +406,7 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp); tmp->syscall_info = create_syscall_info(__NR_open, cpu_id, tid, -1); tmp->files_history = create_file(tmp->files_history, file); @@ -419,9 +422,10 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, void *private_data) { const struct definition *scope; - unsigned long timestamp; - int64_t tid, pid; struct processtop *tmp; + unsigned long timestamp; + int64_t tid; + char *procname; int fd; timestamp = bt_ctf_get_timestamp(call_data); @@ -430,7 +434,7 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, tid = get_context_tid(call_data); - pid = get_context_pid(call_data); + procname = get_context_comm(call_data); scope = bt_ctf_get_top_level_scope(call_data, BT_EVENT_FIELDS); @@ -441,7 +445,7 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, goto error; } - tmp = get_proc_pid(<tngtop, tid, pid, timestamp); + tmp = get_proc(<tngtop, tid, procname, timestamp); close_file(tmp, fd); diff --git a/src/lttngtop.c b/src/lttngtop.c index dc5711e..52f0046 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -412,6 +412,12 @@ void iter_trace(struct bt_context *bt_ctx) bt_ctf_iter_add_callback(iter, g_quark_from_static_string("sched_process_free"), NULL, 0, handle_sched_process_free, NULL, NULL, NULL); + /* to get all the process from the statedumps */ + bt_ctf_iter_add_callback(iter, + g_quark_from_static_string( + "lttng_statedump_process_state"), + NULL, 0, handle_statedump_process_state, + NULL, NULL, NULL); /* for IO top */ bt_ctf_iter_add_callback(iter, -- 2.34.1