X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng%2Flttng.c;h=8a0d58faeaa8ac7ec7299a7a633d9ada73e8e513;hp=9751621ff84f2c4fceb2267c5dd1b1ec6f83e1ae;hb=520ff6876d5fdf7e5421733a8f2a7d0c20e43c8c;hpb=8548ff30b847b76f7f62770ad5512883ee1e775a diff --git a/lttng/lttng.c b/lttng/lttng.c index 9751621ff..8a0d58fae 100644 --- a/lttng/lttng.c +++ b/lttng/lttng.c @@ -42,11 +42,12 @@ static char *progname; 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 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 @@ -80,6 +81,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,6 +104,7 @@ 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); } @@ -108,6 +117,24 @@ static int process_client_opt(void) 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; + } + MSG("Trace started successfully!"); + } + + if (opt_stop_trace) { + DBG("Stop trace for pid %d", opt_stop_trace); + ret = lttng_ust_stop_trace(opt_stop_trace); + if (ret < 0) { + goto end; + } + MSG("Trace stopped successfully!"); + } + return 0; end: @@ -115,6 +142,47 @@ end: 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; +} + /* * process_opt_create_session * @@ -192,8 +260,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; } @@ -213,34 +281,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; } /* @@ -255,8 +321,8 @@ not_running: static int validate_options(void) { if ((opt_session_uuid == NULL) && - (opt_create_trace)) { - ERR("Can't create trace without a session ID.\nPlease specify using --session UUID"); + (opt_create_trace || opt_start_trace || opt_list_traces)) { + ERR("You need to specify a session UUID.\nPlease use --session UUID to do so."); goto error; } @@ -400,15 +466,17 @@ end: */ static void sighandler(int sig) { - DBG("%d received", sig); switch (sig) { case SIGTERM: + DBG("SIGTERM catched"); clean_exit(EXIT_FAILURE); break; case SIGCHLD: /* Notify is done */ + DBG("SIGCHLD catched"); break; default: + DBG("Unknown signal %d catched", sig); break; }