prepare the 0.3 release
[lttngtop.git] / src / lttngtop.c
index cce1901775067469f37bd29ab2ae5e258b4f3c24..c38825231641d5035ec3f899a5f180ffdf5a3c39 100644 (file)
@@ -39,7 +39,9 @@
 #include <assert.h>
 #include <sys/mman.h>
 #include <sys/wait.h>
-#include <lttng/lttng.h>
+
+#define LTTNG_SYMBOL_NAME_LEN 256
+
 #ifdef LTTNGTOP_MMAP_LIVE
 #include <lttng/lttngtop-helper.h>
 #include <babeltrace/lttngtopmmappacketseek.h>
@@ -51,6 +53,7 @@
 #include "iostreamtop.h"
 #include "common.h"
 #include "network-live.h"
+#include "lttng-session.h"
 
 #ifdef HAVE_LIBNCURSES
 #include "cursesdisplay.h"
@@ -107,6 +110,8 @@ enum {
        OPT_OUTPUT_FILE,
        OPT_VERBOSE,
        OPT_GUI_TEST,
+       OPT_CREATE_LOCAL_SESSION,
+       OPT_CREATE_LIVE_SESSION,
 };
 
 static struct poptOption long_options[] = {
@@ -124,6 +129,8 @@ static struct poptOption long_options[] = {
        { "output", 'o', POPT_ARG_STRING, &opt_output, OPT_OUTPUT_FILE, NULL, NULL },
        { "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
        { "gui-test", 'g', POPT_ARG_NONE, NULL, OPT_GUI_TEST, NULL, NULL },
+       { "create-local-session", 0, POPT_ARG_NONE, NULL, OPT_CREATE_LOCAL_SESSION, NULL, NULL },
+       { "create-live-session", 0, POPT_ARG_NONE, NULL, OPT_CREATE_LIVE_SESSION, NULL, NULL },
        { NULL, 0, 0, NULL, 0, NULL, NULL },
 };
 
@@ -260,6 +267,7 @@ enum bt_cb_ret textdump(struct bt_ctf_event *call_data, void *private_data)
        const char *hostname, *procname;
        struct cputime *cpu;
        char *from_syscall = NULL;
+       int syscall_exit = 0;
 
        timestamp = bt_ctf_get_timestamp(call_data);
 
@@ -314,15 +322,22 @@ enum bt_cb_ret textdump(struct bt_ctf_event *call_data, void *private_data)
                }
        }
 
-       if (last_syscall && (strncmp(bt_ctf_event_name(call_data),
-                                "exit_syscall", 12)) != 0) {
+       if (((strncmp(bt_ctf_event_name(call_data),
+                                               "exit_syscall", 12)) == 0) ||
+                       ((strncmp(bt_ctf_event_name(call_data),
+                                "syscall_exit", 12)) == 0)) {
+               syscall_exit = 1;
+       }
+
+       if (last_syscall && !syscall_exit) {
                last_syscall = NULL;
                fprintf(output, " ...interrupted...\n");
        }
 
        cpu_id = get_cpu_id(call_data);
        procname = get_context_comm(call_data);
-       if (strncmp(bt_ctf_event_name(call_data), "sys_", 4) == 0) {
+       if ((strncmp(bt_ctf_event_name(call_data), "sys_", 4) == 0) ||
+                       (strncmp(bt_ctf_event_name(call_data), "syscall_entry", 13) == 0)){
                cpu = get_cpu(cpu_id);
                cpu->current_syscall = g_new0(struct syscall, 1);
                cpu->current_syscall->name = strdup(bt_ctf_event_name(call_data));
@@ -330,7 +345,7 @@ enum bt_cb_ret textdump(struct bt_ctf_event *call_data, void *private_data)
                cpu->current_syscall->cpu_id = cpu_id;
                last_syscall = cpu->current_syscall;
                current_syscall = 1;
-       } else if ((strncmp(bt_ctf_event_name(call_data), "exit_syscall", 12)) == 0) {
+       } else if (syscall_exit) {
                struct tm start_ts;
 
                /* Return code of a syscall if it was the last displayed event. */
@@ -692,6 +707,8 @@ void usage(FILE *fp)
        fprintf(fp, "  -b, --begin              Network live streaming : read the trace for the beginning of the recording\n");
        fprintf(fp, "  -o, --output <filename>  In textdump, output the log in <filename>\n");
        fprintf(fp, "  -g, --gui-test           Test if the ncurses support is compiled in (return 0 if it is)\n");
+       fprintf(fp, "  --create-local-session   Setup a LTTng local session with all the right parameters\n");
+       fprintf(fp, "  --create-live-session    Setup a LTTng live session on localhost with all the right parameters\n");
 }
 
 /*
@@ -799,6 +816,12 @@ static int parse_options(int argc, char **argv)
                                exit(EXIT_FAILURE);
 #endif
                                goto end;
+                       case OPT_CREATE_LOCAL_SESSION:
+                               ret = create_local_session();
+                               exit(ret);
+                       case OPT_CREATE_LIVE_SESSION:
+                               ret = create_live_local_session(NULL, NULL, 1);
+                               exit(ret);
                        case OPT_TEXTDUMP:
                                opt_textdump = 1;
                                break;
@@ -930,15 +953,36 @@ void iter_trace(struct bt_context *bt_ctx)
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("sys_open"),
                        NULL, 0, handle_sys_open, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_entry_open"),
+                       NULL, 0, handle_sys_open, NULL, NULL, NULL);
+
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("sys_socket"),
                        NULL, 0, handle_sys_socket, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_entry_socket"),
+                       NULL, 0, handle_sys_socket, NULL, NULL, NULL);
+
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("sys_close"),
                        NULL, 0, handle_sys_close, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_entry_close"),
+                       NULL, 0, handle_sys_close, NULL, NULL, NULL);
+
        bt_ctf_iter_add_callback(iter,
                        g_quark_from_static_string("exit_syscall"),
                        NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_exit_open"),
+                       NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_exit_socket"),
+                       NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
+       bt_ctf_iter_add_callback(iter,
+                       g_quark_from_static_string("syscall_exit_close"),
+                       NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
        if (opt_textdump) {
                bt_ctf_iter_add_callback(iter, 0, NULL, 0,
                                textdump,
@@ -956,9 +1000,22 @@ void iter_trace(struct bt_context *bt_ctx)
                bt_ctf_iter_add_callback(iter,
                                g_quark_from_static_string("sys_write"),
                                NULL, 0, handle_sys_write, NULL, NULL, NULL);
+               bt_ctf_iter_add_callback(iter,
+                               g_quark_from_static_string("syscall_entry_write"),
+                               NULL, 0, handle_sys_write, NULL, NULL, NULL);
+               bt_ctf_iter_add_callback(iter,
+                               g_quark_from_static_string("syscall_exit_write"),
+                               NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
+
                bt_ctf_iter_add_callback(iter,
                                g_quark_from_static_string("sys_read"),
                                NULL, 0, handle_sys_read, NULL, NULL, NULL);
+               bt_ctf_iter_add_callback(iter,
+                               g_quark_from_static_string("syscall_entry_read"),
+                               NULL, 0, handle_sys_read, NULL, NULL, NULL);
+               bt_ctf_iter_add_callback(iter,
+                               g_quark_from_static_string("syscall_exit_read"),
+                               NULL, 0, handle_exit_syscall, NULL, NULL, NULL);
 
                /* for kprobes */
                if (lttngtop.kprobes_table) {
@@ -1233,6 +1290,7 @@ int main(int argc, char **argv, char **envp)
 {
        int ret;
        struct bt_context *bt_ctx = NULL;
+       char *live_session_name = NULL;
 
        init_lttngtop();
        ret = parse_options(argc, argv);
@@ -1251,28 +1309,13 @@ int main(int argc, char **argv, char **envp)
 
        if (!opt_input_path && !remote_live && !opt_exec_name) {
                /* mmap live */
-#ifdef LTTNGTOP_MMAP_LIVE
-               if (opt_textdump) {
-                       signal(SIGTERM, handle_textdump_sigterm);
-                       signal(SIGINT, handle_textdump_sigterm);
-               }
-               mmap_live_loop(bt_ctx);
-               pthread_join(timer_thread, NULL);
-               quit = 1;
-               pthread_join(display_thread, NULL);
-
-               lttng_stop_tracing("test");
-               lttng_destroy_session("test");
-
-               goto end;
-#else
-               fprintf(stderr, "[ERROR] Mmap live support not compiled, specify a "
-                               "trace directory or -r <relayd hostname/IP>\n");
-               usage(stdout);
-               ret = -1;
-               goto end;
-#endif /* LTTNGTOP_MMAP_LIVE */
-       } else if (!opt_input_path && remote_live) {
+               ret = create_live_local_session(&opt_relay_hostname,
+                               &live_session_name, 0);
+               if (ret < 0)
+                       goto end;
+               remote_live = 1;
+       }
+       if (!opt_input_path && remote_live) {
                /* network live */
                bt_ctx = bt_context_create();
                ret = bt_context_add_traces_recursive(bt_ctx, opt_relay_hostname,
@@ -1282,8 +1325,6 @@ int main(int argc, char **argv, char **envp)
                        goto end;
                }
        } else {
-               //init_lttngtop();
-
                bt_ctx = bt_context_create();
                ret = bt_context_add_traces_recursive(bt_ctx, opt_input_path, "ctf", NULL);
                if (ret < 0) {
@@ -1325,5 +1366,12 @@ end:
        if (bt_ctx)
                bt_context_put(bt_ctx);
 
+       if (live_session_name) {
+               ret = destroy_live_local_session(live_session_name);
+               if (ret < 0) {
+                       fprintf(stderr, "Error destroying %s\n", live_session_name);
+               }
+       }
+
        return ret;
 }
This page took 0.025178 seconds and 4 git commands to generate.