X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=3c3747de1f002a971ab64794f4a6f8ffe68a8036;hp=e538df2fd403f0eefaf2be2c58b3c8a04973067d;hb=7442b2ba0c15bf9c950b96a19e948243c2b57683;hpb=ce3d728cd9bfcc0f7d43e08275a92cf04e898662 diff --git a/lttng/lttng.c b/lttng/lttng.c index e538df2fd..3c3747de1 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -30,23 +30,27 @@ #include #include -#include +#include #include "lttng.h" #include "lttngerr.h" /* Variables */ static char *progname; +static char short_uuid[9]; /* Prototypes */ static int process_client_opt(void); static int process_opt_list_apps(void); static int process_opt_list_sessions(void); +static int process_opt_list_traces(void); static int process_opt_create_session(void); +static int process_opt_session_uuid(void); static void sighandler(int sig); +static void shorten_uuid(char *in, char *out); static int set_signal_handler(void); -static int get_cmdline_by_pid(pid_t pid, char **cmdline); static int validate_options(void); +static char *get_cmdline_by_pid(pid_t pid); /* * start_client @@ -60,12 +64,6 @@ static int process_client_opt(void) int ret; uuid_t uuid; - /* Connect to the session daemon */ - ret = lttng_connect_sessiond(); - if (ret < 0) { - goto end; - } - if (opt_list_apps) { ret = process_opt_list_apps(); if (ret < 0) { @@ -80,6 +78,13 @@ static int process_client_opt(void) } } + if (opt_list_traces) { + ret = process_opt_list_traces(); + if (ret < 0) { + goto end; + } + } + if (opt_create_session != NULL) { ret = process_opt_create_session(); if (ret < 0) { @@ -96,26 +101,45 @@ static int process_client_opt(void) } if (opt_session_uuid != NULL) { - DBG("Set session uuid to %s", opt_session_uuid); - lttng_set_current_session_uuid(opt_session_uuid); - } - - if (opt_create_trace) { - DBG("Create trace for pid %d", opt_create_trace); - ret = lttng_ust_create_trace(opt_create_trace); + DBG("Set session uuid to %s", short_uuid); + ret = process_opt_session_uuid(); if (ret < 0) { - goto end; + ERR("Session UUID %s not found", opt_session_uuid); + goto error; } - MSG("Trace created successfully!\nUse --start PID to start tracing."); } - if (opt_start_trace) { - DBG("Start trace for pid %d", opt_start_trace); - ret = lttng_ust_start_trace(opt_start_trace); - if (ret < 0) { - goto end; + if (opt_trace_kernel) { + ERR("Not implemented yet"); + goto end; + } + + if (opt_trace_pid != 0) { + if (opt_create_trace) { + DBG("Create a userspace trace for pid %d", opt_trace_pid); + ret = lttng_ust_create_trace(opt_trace_pid); + if (ret < 0) { + goto end; + } + MSG("Trace created successfully!\nUse --start to start tracing."); } - MSG("Trace started successfully!"); + + if (opt_start_trace) { + DBG("Start trace for pid %d", opt_trace_pid); + ret = lttng_ust_start_trace(opt_trace_pid); + if (ret < 0) { + goto end; + } + MSG("Trace started successfully!"); + } else if (opt_stop_trace) { + DBG("Stop trace for pid %d", opt_trace_pid); + ret = lttng_ust_stop_trace(opt_trace_pid); + if (ret < 0) { + goto end; + } + MSG("Trace stopped successfully!"); + } + } return 0; @@ -123,6 +147,82 @@ static int process_client_opt(void) end: ERR("%s", lttng_get_readable_code(ret)); return ret; + +error: + return ret; +} + +/* + * process_opt_session_uuid + * + * Set current session uuid to the current flow of + * command(s) using the already shorten uuid. + */ +static int process_opt_session_uuid(void) +{ + int ret, count, i; + struct lttng_session *sessions; + + count = lttng_list_sessions(&sessions); + if (count < 0) { + ret = count; + goto error; + } + + for (i = 0; i < count; i++) { + if (strncmp(sessions[i].uuid, short_uuid, 8) == 0) { + lttng_set_current_session_uuid(sessions[i].uuid); + break; + } + } + + free(sessions); + + return 0; + +error: + return ret; +} + +/* + * process_opt_list_traces + * + * Get list of all traces for a specific session uuid. + */ +static int process_opt_list_traces(void) +{ + int ret, i; + uuid_t uuid; + struct lttng_trace *traces; + + uuid_parse(opt_session_uuid, uuid); + ret = lttng_list_traces(&uuid, &traces); + if (ret < 0) { + goto error; + } + + MSG("Userspace traces:"); + for (i = 0; i < ret; i++) { + if (traces[i].type == USERSPACE) { + MSG("\t%d) %s (pid: %d): %s", + i, traces[i].name, traces[i].pid, + get_cmdline_by_pid(traces[i].pid)); + } else { + break; + } + } + + MSG("Kernel traces:"); + for (;i < ret; i++) { + if (traces[i].type == KERNEL) { + MSG("\t%d) %s", i, traces[i].name); + } + } + + free(traces); + +error: + return ret; } /* @@ -151,6 +251,38 @@ error: return ret; } +/* + * extract_short_uuid + * + * Extract shorten uuid and copy it to out. + * Shorten uuid format : '.' + */ +static int extract_short_uuid(char *in, char *out) +{ + char *tok; + + tok = strchr(in, '.'); + if (strlen(tok+1) == 8) { + memcpy(out, tok+1, 8); + out[9] = '\0'; + return 0; + } + + return -1; +} + +/* + * shorten_uuid + * + * Small function to shorten the 37 bytes long uuid_t + * string representation to 8 characters. + */ +static void shorten_uuid(char *in, char *out) +{ + memcpy(out, in, 8); + out[8] = '\0'; +} + /* * process_opt_list_sessions * @@ -160,21 +292,24 @@ error: static int process_opt_list_sessions(void) { int ret, count, i; + char tmp_short_uuid[9]; struct lttng_session *sess; count = lttng_list_sessions(&sess); + DBG("Session count %d", count); if (count < 0) { ret = count; goto error; } - MSG("Available sessions [Name (uuid)]:"); + MSG("Available sessions (UUIDs):"); for (i = 0; i < count; i++) { - MSG("\tName: %s (uuid: %s)", sess[i].name, sess[i].uuid); + shorten_uuid(sess[i].uuid, tmp_short_uuid); + MSG(" %d) %s.%s", i+1, sess[i].name, tmp_short_uuid); } free(sess); - MSG("\nTo select a session, use --session UUID."); + MSG("\nTo select a session, use -s, --session UUID."); return 0; @@ -202,8 +337,8 @@ static int process_opt_list_apps(void) MSG("LTTng UST traceable application [name (pid)]:"); for (i=0; i < count; i++) { - ret = get_cmdline_by_pid(pids[i], &cmdline); - if (!ret) { + cmdline = get_cmdline_by_pid(pids[i]); + if (cmdline == NULL) { MSG("\t(not running) (%d)", pids[i]); continue; } @@ -223,34 +358,32 @@ error: /* * get_cmdline_by_pid * - * Get command line from /proc for a - * specific pid. Allocate cmdline so the - * user must free() that pointer. + * Get command line from /proc for a specific pid. * - * On success, return 1 - * On error (not found), return 0 + * On success, return an allocated string pointer pointing to + * the proc cmdline. + * On error, return NULL. */ -static int get_cmdline_by_pid(pid_t pid, char **cmdline) +static char *get_cmdline_by_pid(pid_t pid) { int ret; FILE *fp; + char *cmdline = NULL; char path[24]; /* Can't go bigger than /proc/65535/cmdline */ snprintf(path, sizeof(path), "/proc/%d/cmdline", pid); fp = fopen(path, "r"); if (fp == NULL) { - goto not_running; + goto end; } /* Caller must free() *cmdline */ - *cmdline = malloc(PATH_MAX); - ret = fread(*cmdline, 1, PATH_MAX, fp); + cmdline = malloc(PATH_MAX); + ret = fread(cmdline, 1, PATH_MAX, fp); fclose(fp); - return 1; - -not_running: - return 0; +end: + return cmdline; } /* @@ -264,12 +397,32 @@ not_running: */ static int validate_options(void) { - if ((opt_session_uuid == NULL) && - (opt_create_trace || opt_start_trace)) { - ERR("Can't act on trace without a session ID.\nPlease specify using --session UUID"); + int ret; + + /* Conflicting command */ + if (opt_start_trace && opt_stop_trace) { + ERR("Can't use --start and --stop together."); + goto error; + /* Must have a session UUID for trace action. */ + } else if ((opt_session_uuid == NULL) && + (opt_create_trace || opt_start_trace || opt_stop_trace || opt_list_traces)) { + ERR("You need to specify a session UUID.\nPlease use --session UUID to do so."); + goto error; + /* If no PID specified and trace_kernel is off */ + } else if ((opt_trace_pid == 0 && opt_trace_kernel == 0) && + (opt_create_trace || opt_start_trace || opt_stop_trace)) { + ERR("Please specify a PID using -p, --pid PID."); goto error; } + if (opt_session_uuid != NULL) { + ret = extract_short_uuid(opt_session_uuid, short_uuid); + if (ret < 0) { + ERR("Session UUID not valid. Must be ."); + goto error; + } + } + return 0; error: @@ -426,15 +579,13 @@ static void sighandler(int sig) return; } + /* * clean_exit */ void clean_exit(int code) { DBG("Clean exit"); - if (lttng_disconnect_sessiond() < 0) { - ERR("Session daemon disconnect failed."); - } exit(code); }