X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Flist.c;h=0467cc6ba32d6afc828bcaeec34e31c0b58ed416;hp=93758381c9678a9afb5554c9d220d9776f272afd;hb=590b9e3c8fdaf2912d5919244a475f0e2f32f1b5;hpb=8b703175f140287205a8dba654f0201b9947761d diff --git a/src/bin/lttng/commands/list.c b/src/bin/lttng/commands/list.c index 93758381c..0467cc6ba 100644 --- a/src/bin/lttng/commands/list.c +++ b/src/bin/lttng/commands/list.c @@ -1,19 +1,18 @@ /* * Copyright (C) 2011 - David Goulet * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; only version 2 - * of the License. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 only, + * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _GNU_SOURCE @@ -30,6 +29,7 @@ static int opt_userspace; static int opt_kernel; static char *opt_channel; static int opt_domain; +static int opt_fields; #if 0 /* Not implemented yet */ static char *opt_cmd_name; @@ -61,6 +61,7 @@ static struct poptOption long_options[] = { #endif {"channel", 'c', POPT_ARG_STRING, &opt_channel, 0, 0, 0}, {"domain", 'd', POPT_ARG_VAL, &opt_domain, 1, 0, 0}, + {"fields", 'f', POPT_ARG_VAL, &opt_fields, 1, 0, 0}, {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL}, {0, 0, 0, 0, 0, 0, 0} }; @@ -81,6 +82,7 @@ static void usage(FILE *ofp) fprintf(ofp, " --list-options Simple listing of options\n"); fprintf(ofp, " -k, --kernel Select kernel domain\n"); fprintf(ofp, " -u, --userspace Select user-space domain.\n"); + fprintf(ofp, " -f, --fields List event fields.\n"); #if 0 fprintf(ofp, " -p, --pid PID List user-space events by PID\n"); #endif @@ -144,6 +146,15 @@ const char *enabled_string(int value) } } +static +const char *filter_string(int value) +{ + switch (value) { + case 1: return " [with filter]"; + default: return ""; + } +} + static const char *loglevel_string(int value) { switch (value) { @@ -193,23 +204,26 @@ static void print_events(struct lttng_event *event) case LTTNG_EVENT_TRACEPOINT: { if (event->loglevel != -1) { - MSG("%s%s (loglevel: %s (%d)) (type: tracepoint)%s", + MSG("%s%s (loglevel: %s (%d)) (type: tracepoint)%s%s", indent6, event->name, loglevel_string(event->loglevel), event->loglevel, - enabled_string(event->enabled)); + enabled_string(event->enabled), + filter_string(event->filter)); } else { - MSG("%s%s (type: tracepoint)%s", + MSG("%s%s (type: tracepoint)%s%s", indent6, event->name, - enabled_string(event->enabled)); + enabled_string(event->enabled), + filter_string(event->filter)); } break; } case LTTNG_EVENT_PROBE: - MSG("%s%s (type: probe)%s", indent6, - event->name, enabled_string(event->enabled)); + MSG("%s%s (type: probe)%s%s", indent6, + event->name, enabled_string(event->enabled), + filter_string(event->filter)); if (event->attr.probe.addr != 0) { MSG("%saddr: 0x%" PRIx64, indent8, event->attr.probe.addr); } else { @@ -219,17 +233,20 @@ static void print_events(struct lttng_event *event) break; case LTTNG_EVENT_FUNCTION: case LTTNG_EVENT_FUNCTION_ENTRY: - MSG("%s%s (type: function)%s", indent6, - event->name, enabled_string(event->enabled)); + MSG("%s%s (type: function)%s%s", indent6, + event->name, enabled_string(event->enabled), + filter_string(event->filter)); MSG("%ssymbol: \"%s\"", indent8, event->attr.ftrace.symbol_name); break; case LTTNG_EVENT_SYSCALL: - MSG("%ssyscalls (type: syscall)%s", indent6, - enabled_string(event->enabled)); + MSG("%ssyscalls (type: syscall)%s%s", indent6, + enabled_string(event->enabled), + filter_string(event->filter)); break; case LTTNG_EVENT_NOOP: - MSG("%s (type: noop)%s", indent6, - enabled_string(event->enabled)); + MSG("%s (type: noop)%s%s", indent6, + enabled_string(event->enabled), + filter_string(event->filter)); break; case LTTNG_EVENT_ALL: /* We should never have "all" events in list. */ @@ -238,6 +255,35 @@ static void print_events(struct lttng_event *event) } } +static const char *field_type(struct lttng_event_field *field) +{ + switch(field->type) { + case LTTNG_EVENT_FIELD_INTEGER: + return "integer"; + case LTTNG_EVENT_FIELD_ENUM: + return "enum"; + case LTTNG_EVENT_FIELD_FLOAT: + return "float"; + case LTTNG_EVENT_FIELD_STRING: + return "string"; + case LTTNG_EVENT_FIELD_OTHER: + default: /* fall-through */ + return "unknown"; + } +} + +/* + * Pretty print single event fields. + */ +static void print_event_field(struct lttng_event_field *field) +{ + if (!field->field_name[0]) { + return; + } + MSG("%sfield: %s (%s)%s", indent8, field->field_name, + field_type(field), field->nowrite ? "" : " [no write]"); +} + /* * Ask session daemon for all user space tracepoints available. */ @@ -293,6 +339,68 @@ error: return -1; } +/* + * Ask session daemon for all user space tracepoint fields available. + */ +static int list_ust_event_fields(void) +{ + int i, size; + struct lttng_domain domain; + struct lttng_handle *handle; + struct lttng_event_field *event_field_list; + pid_t cur_pid = 0; + struct lttng_event cur_event; + + memset(&domain, 0, sizeof(domain)); + memset(&cur_event, 0, sizeof(cur_event)); + + DBG("Getting UST tracing event fields"); + + domain.type = LTTNG_DOMAIN_UST; + + handle = lttng_create_handle(NULL, &domain); + if (handle == NULL) { + goto error; + } + + size = lttng_list_tracepoint_fields(handle, &event_field_list); + if (size < 0) { + ERR("Unable to list UST event fields"); + lttng_destroy_handle(handle); + return size; + } + + MSG("UST events:\n-------------"); + + if (size == 0) { + MSG("None"); + } + + for (i = 0; i < size; i++) { + if (cur_pid != event_field_list[i].event.pid) { + cur_pid = event_field_list[i].event.pid; + MSG("\nPID: %d - Name: %s", cur_pid, get_cmdline_by_pid(cur_pid)); + } + if (strcmp(cur_event.name, event_field_list[i].event.name) != 0) { + print_events(&event_field_list[i].event); + memcpy(&cur_event, &event_field_list[i].event, + sizeof(cur_event)); + } + print_event_field(&event_field_list[i]); + } + + MSG(""); + + free(event_field_list); + lttng_destroy_handle(handle); + + return CMD_SUCCESS; + +error: + lttng_destroy_handle(handle); + return -1; +} + /* * Ask for all trace events in the kernel and pretty print them. */ @@ -475,6 +583,9 @@ static int list_sessions(const char *session_name) if (count < 0) { ret = count; goto error; + } else if (count == 0) { + MSG("Currently no available tracing session"); + goto end; } if (session_name == NULL) { @@ -512,6 +623,7 @@ static int list_sessions(const char *session_name) MSG("\nUse lttng list for more details"); } +end: return CMD_SUCCESS; error: @@ -631,7 +743,11 @@ int cmd_list(int argc, const char **argv) } } if (opt_userspace) { - ret = list_ust_events(); + if (opt_fields) { + ret = list_ust_event_fields(); + } else { + ret = list_ust_events(); + } if (ret < 0) { goto end; }