statedump_process_state & problems patches
authorMathieu Bain <mathieu.bain@polymtl.ca>
Tue, 3 Apr 2012 15:10:19 +0000 (11:10 -0400)
committerJulien Desfossez <julien.desfossez@efficios.com>
Tue, 3 Apr 2012 15:10:19 +0000 (11:10 -0400)
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 <mathieu.bain@polymtl.ca>
Signed-off-by: Julien Desfossez <julien.desfossez@efficios.com>
src/common.c
src/common.h
src/iostreamtop.c
src/lttngtop.c

index b18eafd554569fa14f26dfa9135246406884def4..3051f7e3b62b0ab7ac0d5c8cf6d74d291bfc48fa 100644 (file)
@@ -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(&lttngtop, tid, procname);
+       if (proc == NULL)
+               proc = add_proc(&lttngtop, 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;
+}
index 21df7b11603918380d3d04ef41078332dd583075..0903413a157e43bf42547f3f137160b50d42f70f 100644 (file)
@@ -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 */
index 7c1d611af8b74b1a7e6aa1ac566b2fbc5c8b52ad..33b901938b9356e65690694c297f403483edd84b 100644 (file)
@@ -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(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, 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(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, 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(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, 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(&lttngtop, tid, pid, timestamp);
+       tmp = get_proc(&lttngtop, tid, procname, timestamp);
 
        close_file(tmp, fd);
 
index dc5711ea91402ede478a3662184d6ffcdc57f498..52f0046bd63f4e3cdc74a021a4cc9d20da4f19ee 100644 (file)
@@ -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,
This page took 0.026772 seconds and 4 git commands to generate.