X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Flist.c;h=f69d34db99aab59b115cf3c6cdf9b77f2a3a9252;hp=f33e8d0e3d43ff85cd77eab67186f96bef120c26;hb=6c1c0768320135c6936c371b09731851b508c023;hpb=485ca16f3528b1b07e4c252cf4b672c2e98dfd11 diff --git a/src/bin/lttng/commands/list.c b/src/bin/lttng/commands/list.c index f33e8d0e3..f69d34db9 100644 --- a/src/bin/lttng/commands/list.c +++ b/src/bin/lttng/commands/list.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -30,9 +31,12 @@ static int opt_userspace; static int opt_kernel; static int opt_jul; +static int opt_log4j; +static int opt_python; static char *opt_channel; static int opt_domain; static int opt_fields; +static int opt_syscall; #if 0 /* Not implemented yet */ static char *opt_cmd_name; @@ -57,6 +61,8 @@ static struct poptOption long_options[] = { {"help", 'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0}, {"kernel", 'k', POPT_ARG_VAL, &opt_kernel, 1, 0, 0}, {"jul", 'j', POPT_ARG_VAL, &opt_jul, 1, 0, 0}, + {"log4j", 'l', POPT_ARG_VAL, &opt_log4j, 1, 0, 0}, + {"python", 'p', POPT_ARG_VAL, &opt_python, 1, 0, 0}, #if 0 /* Not implemented yet */ {"userspace", 'u', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, &opt_cmd_name, OPT_USERSPACE, 0, 0}, @@ -67,6 +73,7 @@ static struct poptOption long_options[] = { {"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}, + {"syscall", 'S', POPT_ARG_VAL, &opt_syscall, 1, 0, 0}, {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL}, {0, 0, 0, 0, 0, 0, 0} }; @@ -88,7 +95,10 @@ static void usage(FILE *ofp) fprintf(ofp, " -k, --kernel Select kernel domain\n"); fprintf(ofp, " -u, --userspace Select user-space domain.\n"); fprintf(ofp, " -j, --jul Apply for Java application using JUL\n"); + fprintf(ofp, " -l, --log4j Apply for Java application using LOG4J\n"); + fprintf(ofp, " -p, --python Apply for Python application using logging\n"); fprintf(ofp, " -f, --fields List event fields.\n"); + fprintf(ofp, " --syscall List available system calls.\n"); #if 0 fprintf(ofp, " -p, --pid PID List user-space events by PID\n"); #endif @@ -108,7 +118,7 @@ static void usage(FILE *ofp) static char *get_cmdline_by_pid(pid_t pid) { int ret; - FILE *fp; + FILE *fp = NULL; char *cmdline = NULL; char path[20]; /* Can't go bigger than /proc/65535/cmdline */ @@ -128,9 +138,11 @@ static char *get_cmdline_by_pid(pid_t pid) if (ret < 0) { perror("fread proc list"); } - fclose(fp); end: + if (fp) { + fclose(fp); + } return cmdline; } @@ -198,6 +210,21 @@ static const char *logleveltype_string(enum lttng_loglevel_type value) } } +static const char *bitness_event(enum lttng_event_flag flags) +{ + if (flags & LTTNG_EVENT_FLAG_SYSCALL_32) { + if (flags & LTTNG_EVENT_FLAG_SYSCALL_64) { + return " [32/64-bit]"; + } else { + return " [32-bit]"; + } + } else if (flags & LTTNG_EVENT_FLAG_SYSCALL_64) { + return " [64-bit]"; + } else { + return ""; + } +} + /* * Pretty print single event. */ @@ -211,7 +238,7 @@ static void print_events(struct lttng_event *event) indent6, event->name, logleveltype_string(event->loglevel_type), - mi_lttng_loglevel_string(event->loglevel), + mi_lttng_loglevel_string(event->loglevel, handle->domain.type), event->loglevel, enabled_string(event->enabled), exclusion_string(event->exclusion), @@ -255,9 +282,10 @@ static void print_events(struct lttng_event *event) MSG("%ssymbol: \"%s\"", indent8, event->attr.ftrace.symbol_name); break; case LTTNG_EVENT_SYSCALL: - MSG("%ssyscalls (type: syscall)%s%s", indent6, + MSG("%s%s%s%s%s", indent6, event->name, + (opt_syscall ? "" : " (type:syscall)"), enabled_string(event->enabled), - filter_string(event->filter)); + bitness_event(event->flags)); break; case LTTNG_EVENT_NOOP: MSG("%s (type: noop)%s%s", indent6, @@ -304,7 +332,7 @@ static void print_event_field(struct lttng_event_field *field) * Machine interface * Jul and ust event listing */ -static int mi_list_jul_ust_events(struct lttng_event *events, int count, +static int mi_list_agent_ust_events(struct lttng_event *events, int count, struct lttng_domain *domain) { int ret, i; @@ -367,7 +395,7 @@ static int mi_list_jul_ust_events(struct lttng_event *events, int count, } /* Write an event */ - ret = mi_lttng_event(writer, &events[i], 0); + ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type); if (ret) { goto end; } @@ -388,7 +416,7 @@ error: return ret; } -static int list_jul_events(void) +static int list_agent_events(void) { int i, size, ret = CMD_SUCCESS; struct lttng_domain domain; @@ -396,11 +424,20 @@ static int list_jul_events(void) struct lttng_event *event_list; pid_t cur_pid = 0; char *cmdline = NULL; - - DBG("Getting JUL tracing events"); + const char *agent_domain_str; memset(&domain, 0, sizeof(domain)); - domain.type = LTTNG_DOMAIN_JUL; + if (opt_jul) { + domain.type = LTTNG_DOMAIN_JUL; + } else if (opt_log4j) { + domain.type = LTTNG_DOMAIN_LOG4J; + } else if (opt_python) { + domain.type = LTTNG_DOMAIN_PYTHON; + } + + agent_domain_str = get_domain_str(domain.type); + + DBG("Getting %s tracing events", agent_domain_str); handle = lttng_create_handle(NULL, &domain); if (handle == NULL) { @@ -410,21 +447,23 @@ static int list_jul_events(void) size = lttng_list_tracepoints(handle, &event_list); if (size < 0) { - ERR("Unable to list JUL events: %s", lttng_strerror(size)); + ERR("Unable to list %s events: %s", agent_domain_str, + lttng_strerror(size)); ret = CMD_ERROR; goto end; } if (lttng_opt_mi) { /* Mi print */ - ret = mi_list_jul_ust_events(event_list, size, &domain); + ret = mi_list_agent_ust_events(event_list, size, &domain); if (ret) { ret = CMD_ERROR; goto error; } } else { /* Pretty print */ - MSG("JUL events (Logger name):\n-------------------------"); + MSG("%s events (Logger name):\n-------------------------", + agent_domain_str); if (size == 0) { MSG("None"); @@ -487,7 +526,7 @@ static int list_ust_events(void) if (lttng_opt_mi) { /* Mi print */ - ret = mi_list_jul_ust_events(event_list, size, &domain); + ret = mi_list_agent_ust_events(event_list, size, &domain); } else { /* Pretty print */ MSG("UST events:\n-------------"); @@ -608,7 +647,8 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count, if (!event_element_open) { /* Open and write the event */ - ret = mi_lttng_event(writer, &cur_event, 1); + ret = mi_lttng_event(writer, &cur_event, 1, + handle->domain.type); if (ret) { goto end; } @@ -746,7 +786,7 @@ static int mi_list_kernel_events(struct lttng_event *events, int count, } for (i = 0; i < count; i++) { - mi_lttng_event(writer, &events[i], 0); + ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type); if (ret) { goto end; } @@ -819,11 +859,84 @@ error: return ret; } +/* + * Machine interface + * Print a list of system calls. + */ +static int mi_list_syscalls(struct lttng_event *events, int count) +{ + int ret, i; + + /* Open events */ + ret = mi_lttng_events_open(writer); + if (ret) { + goto end; + } + + for (i = 0; i < count; i++) { + ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type); + if (ret) { + goto end; + } + } + + /* Close events. */ + ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto end; + } + +end: + return ret; +} + +/* + * Ask for kernel system calls. + */ +static int list_syscalls(void) +{ + int i, size, ret = CMD_SUCCESS; + struct lttng_event *event_list; + + DBG("Getting kernel system call events"); + + size = lttng_list_syscalls(&event_list); + if (size < 0) { + ERR("Unable to list system calls: %s", lttng_strerror(size)); + ret = CMD_ERROR; + goto error; + } + + if (lttng_opt_mi) { + /* Mi print */ + ret = mi_list_syscalls(event_list, size); + if (ret) { + ret = CMD_ERROR; + goto end; + } + } else { + MSG("System calls:\n-------------"); + + for (i = 0; i < size; i++) { + print_events(&event_list[i]); + } + + MSG(""); + } + +end: + free(event_list); + return ret; + +error: + return ret; +} + /* * Machine Interface - * Print a list of jul events + * Print a list of agent events */ -static int mi_list_session_jul_events(struct lttng_event *events, int count) +static int mi_list_session_agent_events(struct lttng_event *events, int count) { int ret, i; @@ -834,7 +947,7 @@ static int mi_list_session_jul_events(struct lttng_event *events, int count) } for (i = 0; i < count; i++) { - ret = mi_lttng_event(writer, &events[i], 0); + ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type); if (ret) { goto end; } @@ -848,11 +961,11 @@ end: } /* - * List JUL events for a specific session using the handle. + * List agent events for a specific session using the handle. * * Return CMD_SUCCESS on success else a negative value. */ -static int list_session_jul_events(void) +static int list_session_agent_events(void) { int ret = CMD_SUCCESS, count, i; struct lttng_event *events = NULL; @@ -866,7 +979,7 @@ static int list_session_jul_events(void) if (lttng_opt_mi) { /* Mi print */ - ret = mi_list_session_jul_events(events, count); + ret = mi_list_session_agent_events(events, count); if (ret) { ret = CMD_ERROR; goto end; @@ -883,7 +996,8 @@ static int list_session_jul_events(void) MSG("%s- %s%s (loglevel%s %s)", indent4, events[i].name, enabled_string(events[i].enabled), logleveltype_string(events[i].loglevel_type), - mi_lttng_loglevel_string(events[i].loglevel)); + mi_lttng_loglevel_string(events[i].loglevel, + handle->domain.type)); } MSG(""); @@ -910,7 +1024,7 @@ static int mi_list_events(struct lttng_event *events, int count) } for (i = 0; i < count; i++) { - ret = mi_lttng_event(writer, &events[i], 0); + ret = mi_lttng_event(writer, &events[i], 0, handle->domain.type); if (ret) { goto end; } @@ -1094,7 +1208,7 @@ static int list_channels(const char *channel_name) } } else { /* Pretty print */ - if (channel_name == NULL) { + if (count) { MSG("Channels:\n-------------"); } @@ -1240,7 +1354,6 @@ static int list_sessions(const char *session_name) /* Pretty print */ if (count == 0) { MSG("Currently no available tracing session"); - ret = CMD_ERROR; goto end; } @@ -1267,7 +1380,6 @@ static int list_sessions(const char *session_name) MSG("%sTrace path: %s", indent4, sessions[i].path); MSG("%sLive timer interval (usec): %u\n", indent4, sessions[i].live_timer_interval); - break; } } @@ -1360,6 +1472,12 @@ static int list_domains(const char *session_name) case LTTNG_DOMAIN_JUL: MSG(" - JUL (Java Util Logging)"); break; + case LTTNG_DOMAIN_LOG4J: + MSG(" - LOG4j (Logging for Java)"); + break; + case LTTNG_DOMAIN_PYTHON: + MSG(" - Python (logging)"); + break; default: break; } @@ -1450,9 +1568,19 @@ int cmd_list(int argc, const char **argv) } else if (opt_jul) { DBG2("Listing JUL domain"); domain.type = LTTNG_DOMAIN_JUL; + } else if (opt_log4j) { + domain.type = LTTNG_DOMAIN_LOG4J; + } else if (opt_python) { + domain.type = LTTNG_DOMAIN_PYTHON; + } + + if (!opt_kernel && opt_syscall) { + WARN("--syscall will only work with the Kernel domain (-k)"); + ret = CMD_ERROR; + goto end; } - if (opt_kernel || opt_userspace || opt_jul) { + if (opt_kernel || opt_userspace || opt_jul || opt_log4j || opt_python) { handle = lttng_create_handle(session_name, &domain); if (handle == NULL) { ret = CMD_FATAL; @@ -1461,16 +1589,24 @@ int cmd_list(int argc, const char **argv) } if (session_name == NULL) { - if (!opt_kernel && !opt_userspace && !opt_jul) { + if (!opt_kernel && !opt_userspace && !opt_jul && !opt_log4j + && !opt_python) { ret = list_sessions(NULL); if (ret) { goto end; } } if (opt_kernel) { - ret = list_kernel_events(); - if (ret) { - goto end; + if (opt_syscall) { + ret = list_syscalls(); + if (ret) { + goto end; + } + } else { + ret = list_kernel_events(); + if (ret) { + goto end; + } } } if (opt_userspace) { @@ -1483,8 +1619,8 @@ int cmd_list(int argc, const char **argv) goto end; } } - if (opt_jul) { - ret = list_jul_events(); + if (opt_jul || opt_log4j || opt_python) { + ret = list_agent_events(); if (ret) { goto end; } @@ -1578,6 +1714,12 @@ int cmd_list(int argc, const char **argv) case LTTNG_DOMAIN_JUL: MSG("=== Domain: JUL (Java Util Logging) ===\n"); break; + case LTTNG_DOMAIN_LOG4J: + MSG("=== Domain: LOG4j (Logging for Java) ===\n"); + break; + case LTTNG_DOMAIN_PYTHON: + MSG("=== Domain: Python (logging) ===\n"); + break; default: MSG("=== Domain: Unimplemented ===\n"); break; @@ -1602,8 +1744,10 @@ int cmd_list(int argc, const char **argv) goto end; } - if (domains[i].type == LTTNG_DOMAIN_JUL) { - ret = list_session_jul_events(); + if (domains[i].type == LTTNG_DOMAIN_JUL || + domains[i].type == LTTNG_DOMAIN_LOG4J || + domains[i].type == LTTNG_DOMAIN_PYTHON) { + ret = list_session_agent_events(); if (ret) { goto end; }