attach to a process in gui or textdump + fix get_proc returning NULL for filtering
authorJulien Desfossez <jdesfossez@efficios.com>
Mon, 27 Aug 2012 03:26:45 +0000 (23:26 -0400)
committerJulien Desfossez <jdesfossez@efficios.com>
Sat, 19 Oct 2013 16:02:38 +0000 (12:02 -0400)
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
src/common.c
src/common.h
src/iostreamtop.c
src/lttngtop.c

index f4974e77a3bb0c64f1638c4ed3bd22ba0c41b8ed..cde69a0b0a0eab09521aeb30f1d74e3513093864 100644 (file)
@@ -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(&lttngtop, 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;
 
index 2458c85028ca0c4aabc59ea559965ed0c21cf463..86f979f7e47ce653a457f69ae5fac60ad964d561 100644 (file)
@@ -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;
index e280a3382e8b382a7d08e18a5d96c470b6af738c..d3172f0648a3a8f49e1f6107c9e6d8efb0b75f88 100644 (file)
@@ -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(&lttngtop, 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(&lttngtop, 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(&lttngtop, 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(&lttngtop, 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(&lttngtop, 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:
index 43bffdef7446725633822c847affdb6bed5514ba..08376cd6b0199aac096088b9e8b40a9a7f73a8c1 100644 (file)
@@ -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(&lttngtop, tid, comm);
        if (!child)
                child = add_proc(&lttngtop, 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(&lttngtop, pid, comm);
                if (!parent) {
                        parent = add_proc(&lttngtop, 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",
This page took 0.027272 seconds and 4 git commands to generate.