attach to a process in gui or textdump + fix get_proc returning NULL for filtering
[lttngtop.git] / src / lttngtop.c
index 28acebf6c1134851571acd243919d672bbe188e1..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;
@@ -105,8 +104,8 @@ void *refresh_thread(void *p)
                        pthread_exit(0);
                }
                if (!opt_input_path) {
-               bt_list_for_each_entry(mmap_info, &mmap_list.head, list)
-                       helper_kernctl_buffer_flush(mmap_info->fd);
+                       bt_list_for_each_entry(mmap_info, &mmap_list.head, list)
+                               helper_kernctl_buffer_flush(mmap_info->fd);
                }
                sem_wait(&pause_sem);
                sem_post(&pause_sem);
@@ -157,6 +156,8 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat
        struct tm start;
        uint64_t ts_nsec_start;
        int pid;
+       int64_t syscall_ret;
+       const struct definition *scope;
 
        timestamp = bt_ctf_get_timestamp(call_data);
 
@@ -171,9 +172,17 @@ enum bt_cb_ret print_timestamp(struct bt_ctf_event *call_data, void *private_dat
        if (opt_pid && opt_pid != pid)
                goto end;
 
-       printf("%02d:%02d:%02d.%09" PRIu64 " %d : %s\n", start.tm_hour,
-                       start.tm_min, start.tm_sec, ts_nsec_start,
-                       pid, bt_ctf_event_name(call_data));
+       if (strcmp(bt_ctf_event_name(call_data), "exit_syscall") == 0) {
+               scope = bt_ctf_get_top_level_scope(call_data,
+                               BT_EVENT_FIELDS);
+               syscall_ret = bt_ctf_get_int64(bt_ctf_get_field(call_data,
+                                       scope, "_ret"));
+               printf("= %ld\n", syscall_ret);
+       } else {
+               printf("%02d:%02d:%02d.%09" PRIu64 " %d : %s ", start.tm_hour,
+                               start.tm_min, start.tm_sec, ts_nsec_start,
+                               pid, bt_ctf_event_name(call_data));
+       }
 
 end:
        return BT_CB_OK;
@@ -328,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;
@@ -357,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) {
@@ -364,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 */
@@ -374,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:
@@ -436,7 +450,7 @@ static int parse_options(int argc, char **argv)
                                opt_child = 1;
                                break;
                        case OPT_PID:
-                               opt_textdump = 1;
+                               //opt_textdump = 1;
                                break;
                        default:
                                ret = -EINVAL;
@@ -464,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);
@@ -937,9 +948,13 @@ int setup_live_tracing()
 
        strcpy(chan.name, channel_name);
        chan.attr.overwrite = 0;
-//     chan.attr.subbuf_size = 32768;
-       chan.attr.subbuf_size = 1048576; /* 1MB */
-       chan.attr.num_subbuf = 4;
+       if (opt_pid && opt_textdump) {
+               chan.attr.subbuf_size = 32768;
+               chan.attr.num_subbuf = 8;
+       } else {
+               chan.attr.subbuf_size = 1048576; /* 1MB */
+               chan.attr.num_subbuf = 4;
+       }
        chan.attr.switch_timer_interval = 0;
        chan.attr.read_timer_interval = 200;
        chan.attr.output = LTTNG_EVENT_MMAP;
@@ -952,12 +967,14 @@ int setup_live_tracing()
 
        memset(&ev, '\0', sizeof(struct lttng_event));
        //sprintf(ev.name, "sched_switch");
-       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;
-       }
+//     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) {
@@ -968,16 +985,18 @@ int setup_live_tracing()
 
        kctxpid.ctx = LTTNG_EVENT_CONTEXT_PID;
        lttng_add_context(handle, &kctxpid, NULL, NULL);
-       kctxppid.ctx = LTTNG_EVENT_CONTEXT_PPID;
-       lttng_add_context(handle, &kctxppid, NULL, NULL);
-       kctxcomm.ctx = LTTNG_EVENT_CONTEXT_PROCNAME;
-       lttng_add_context(handle, &kctxcomm, NULL, NULL);
        kctxtid.ctx = LTTNG_EVENT_CONTEXT_TID;
        lttng_add_context(handle, &kctxtid, NULL, NULL);
-       kctxpid.ctx = LTTNG_EVENT_CONTEXT_VPID;
-       lttng_add_context(handle, &kctxpid, NULL, NULL);
-       kctxtid.ctx = LTTNG_EVENT_CONTEXT_VTID;
-       lttng_add_context(handle, &kctxtid, NULL, NULL);
+//     if (!opt_pid) {
+               kctxppid.ctx = LTTNG_EVENT_CONTEXT_PPID;
+               lttng_add_context(handle, &kctxppid, NULL, NULL);
+               kctxcomm.ctx = LTTNG_EVENT_CONTEXT_PROCNAME;
+               lttng_add_context(handle, &kctxcomm, NULL, NULL);
+               kctxpid.ctx = LTTNG_EVENT_CONTEXT_VPID;
+               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.024083 seconds and 4 git commands to generate.