X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=a5569c9af3186e7b9683ee871b32dbb73beee96e;hp=16487ff74a99cb2149bda0964af415ee2721868d;hb=5b97ec606d485e091cf2c2bc06b79f05d18212aa;hpb=1657e9bb835a28e66396deac871270fe373d5ff4 diff --git a/lttng/lttng.c b/lttng/lttng.c index 16487ff74..a5569c9af 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -30,7 +30,7 @@ #include #include -#include +#include #include "lttng.h" #include "lttngerr.h" @@ -46,8 +46,8 @@ static int process_opt_list_traces(void); static int process_opt_create_session(void); static void sighandler(int sig); 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 @@ -108,22 +108,37 @@ static int process_client_opt(void) 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); - if (ret < 0) { - goto end; - } - MSG("Trace created successfully!\nUse --start PID to start tracing."); + if (opt_trace_kernel) { + ERR("Not implemented yet"); + goto end; } - 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_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; @@ -153,7 +168,9 @@ static int process_opt_list_traces(void) MSG("Userspace traces:"); for (i = 0; i < ret; i++) { if (traces[i].type == USERSPACE) { - MSG("\t%d) %s (pid: %d)", i, traces[i].name, traces[i].pid); + MSG("\t%d) %s (pid: %d): %s", + i, traces[i].name, traces[i].pid, + get_cmdline_by_pid(traces[i].pid)); } else { break; } @@ -249,8 +266,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; } @@ -270,34 +287,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; } /* @@ -311,10 +326,20 @@ not_running: */ static int validate_options(void) { - if ((opt_session_uuid == NULL) && - (opt_create_trace || opt_start_trace || opt_list_traces)) { + /* 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; } return 0;