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
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;
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;
}
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;
}
/*
* 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;
}
/*
*/
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;