From 96aa77debf3aee00361101fb2e76781c65f02ba9 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Sun, 26 Aug 2012 23:26:45 -0400 Subject: [PATCH] attach to a process in gui or textdump + fix get_proc returning NULL for filtering Signed-off-by: Julien Desfossez --- src/common.c | 15 ++++++++++++--- src/common.h | 2 ++ src/iostreamtop.c | 25 +++++++++++++++++++++++++ src/lttngtop.c | 24 ++++++++++++------------ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/common.c b/src/common.c index f4974e7..cde69a0 100644 --- a/src/common.c +++ b/src/common.c @@ -164,9 +164,13 @@ struct processtop* add_proc(struct lttngtop *ctx, int tid, char *comm, { struct processtop *newproc; + if (opt_pid && tid != opt_pid) + return NULL; + /* if the PID already exists, we just rename the process */ /* FIXME : need to integrate with clone/fork/exit to be accurate */ newproc = find_process_tid(ctx, tid, comm); + if (!newproc) { newproc = g_new0(struct processtop, 1); newproc->tid = tid; @@ -255,6 +259,9 @@ void add_thread(struct processtop *parent, struct processtop *thread) gint i; struct processtop *tmp; + if (!parent) + return; + for (i = 0; i < parent->threads->len; i++) { tmp = g_ptr_array_index(parent->threads, i); if (tmp == thread) @@ -583,9 +590,11 @@ enum bt_cb_ret handle_statedump_process_state(struct bt_ctf_event *call_data, proc = add_proc(<tngtop, tid, procname, timestamp); update_proc(proc, pid, tid, ppid, vpid, vtid, vppid, procname); - free(proc->comm); - proc->comm = strdup(procname); - proc->pid = pid; + if (proc) { + free(proc->comm); + proc->comm = strdup(procname); + proc->pid = pid; + } return BT_CB_OK; diff --git a/src/common.h b/src/common.h index 2458c85..86f979f 100644 --- a/src/common.h +++ b/src/common.h @@ -31,6 +31,8 @@ sem_t goodtodisplay, goodtoupdate, timer, pause_sem, end_trace_sem, bootstrap; GPtrArray *copies; /* struct lttngtop */ GHashTable *global_perf_liszt; +int opt_pid; + extern int quit; struct lttngtop *data; diff --git a/src/iostreamtop.c b/src/iostreamtop.c index e280a33..d3172f0 100644 --- a/src/iostreamtop.c +++ b/src/iostreamtop.c @@ -197,6 +197,10 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, tmp = get_proc(ctx, tid, comm, timestamp); + if (!tmp) { + err = -1; + goto end; + } if (tmp->syscall_info != NULL) { if (tmp->syscall_info->type == __NR_read && ret > 0) { @@ -223,6 +227,8 @@ int update_iostream_ret(struct lttngtop *ctx, int tid, char *comm, g_free(tmp->syscall_info); tmp->syscall_info = NULL; } + +end: return err; } @@ -329,10 +335,14 @@ enum bt_cb_ret handle_sys_write(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + if (!tmp) + goto end; + tmp->syscall_info = create_syscall_info(__NR_write, cpu_id, tid, fd); insert_file(tmp, fd); +end: return BT_CB_OK; error: @@ -369,10 +379,14 @@ enum bt_cb_ret handle_sys_read(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + if (!tmp) + goto end; + tmp->syscall_info = create_syscall_info(__NR_read, cpu_id, tid, fd); insert_file(tmp, fd); +end: return BT_CB_OK; error: @@ -411,10 +425,14 @@ enum bt_cb_ret handle_sys_open(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + if (!tmp) + goto end; + tmp->syscall_info = create_syscall_info(__NR_open, cpu_id, tid, -1); tmp->files_history = create_file(tmp->files_history, file); +end: return BT_CB_OK; error: @@ -450,9 +468,12 @@ enum bt_cb_ret handle_sys_close(struct bt_ctf_event *call_data, } tmp = get_proc(<tngtop, tid, procname, timestamp); + if (!tmp) + goto end; close_file(tmp, fd); +end: return BT_CB_OK; error: @@ -502,10 +523,14 @@ enum bt_cb_ret handle_statedump_file_descriptor(struct bt_ctf_event *call_data, } parent = get_proc_pid(<tngtop, pid, pid, timestamp); + if (!parent) + goto end; + parent->files_history = create_file(parent->files_history, file_name); file = parent->files_history->file; edit_file(parent, file, fd); +end: return BT_CB_OK; error: diff --git a/src/lttngtop.c b/src/lttngtop.c index 43bffde..08376cd 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -52,7 +52,6 @@ const char *opt_input_path; static int opt_textdump; -static int opt_pid; static int opt_child; int quit = 0; @@ -338,6 +337,7 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, if (pid == -1ULL) { goto error; } + tid = get_context_tid(call_data); if (tid == -1ULL) { goto error; @@ -367,6 +367,8 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, child = find_process_tid(<tngtop, tid, comm); if (!child) child = add_proc(<tngtop, tid, comm, timestamp); + if (!child) + goto end; update_proc(child, pid, tid, ppid, vpid, vtid, vppid, comm); if (pid != tid) { @@ -374,7 +376,8 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, parent = find_process_tid(<tngtop, pid, comm); if (!parent) { parent = add_proc(<tngtop, pid, comm, timestamp); - parent->pid = pid; + if (parent) + parent->pid = pid; } /* attach the parent to the current process */ @@ -384,6 +387,7 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, update_perf_counter(child, call_data); +end: return BT_CB_OK; error: @@ -446,8 +450,7 @@ static int parse_options(int argc, char **argv) opt_child = 1; break; case OPT_PID: - refresh_display = 0.1 * NSEC_PER_SEC; - opt_textdump = 1; + //opt_textdump = 1; break; default: ret = -EINVAL; @@ -475,9 +478,6 @@ void iter_trace(struct bt_context *bt_ctx) iter = bt_ctf_iter_create(bt_ctx, &begin_pos, NULL); if (opt_textdump) { - if (opt_pid) { - printf("PID : %d, Child : %d\n", opt_pid, opt_child); - } bt_ctf_iter_add_callback(iter, 0, NULL, 0, print_timestamp, NULL, NULL, NULL); @@ -948,7 +948,7 @@ int setup_live_tracing() strcpy(chan.name, channel_name); chan.attr.overwrite = 0; - if (opt_pid) { + if (opt_pid && opt_textdump) { chan.attr.subbuf_size = 32768; chan.attr.num_subbuf = 8; } else { @@ -967,14 +967,14 @@ int setup_live_tracing() memset(&ev, '\0', sizeof(struct lttng_event)); //sprintf(ev.name, "sched_switch"); - if (!opt_pid) { +// if (!opt_pid) { ev.type = LTTNG_EVENT_TRACEPOINT; if ((ret = lttng_enable_event(handle, &ev, channel_name)) < 0) { fprintf(stderr,"error enabling event : %s\n", helper_lttcomm_get_readable_code(ret)); goto error_session; } - } +// } ev.type = LTTNG_EVENT_SYSCALL; if ((ret = lttng_enable_event(handle, &ev, channel_name)) < 0) { @@ -987,7 +987,7 @@ int setup_live_tracing() lttng_add_context(handle, &kctxpid, NULL, NULL); kctxtid.ctx = LTTNG_EVENT_CONTEXT_TID; lttng_add_context(handle, &kctxtid, NULL, NULL); - if (!opt_pid) { +// if (!opt_pid) { kctxppid.ctx = LTTNG_EVENT_CONTEXT_PPID; lttng_add_context(handle, &kctxppid, NULL, NULL); kctxcomm.ctx = LTTNG_EVENT_CONTEXT_PROCNAME; @@ -996,7 +996,7 @@ int setup_live_tracing() lttng_add_context(handle, &kctxpid, NULL, NULL); kctxtid.ctx = LTTNG_EVENT_CONTEXT_VTID; lttng_add_context(handle, &kctxtid, NULL, NULL); - } +// } if ((ret = lttng_start_tracing("test")) < 0) { fprintf(stderr,"error starting tracing : %s\n", -- 2.34.1