From: Julien Desfossez Date: Fri, 14 Feb 2014 02:36:19 +0000 (-0500) Subject: Filter based on procname X-Git-Tag: v0.3~32 X-Git-Url: http://git.lttng.org/?p=lttngtop.git;a=commitdiff_plain;h=26e46ddee86d2de5c88997bf8362a6f27a0a2ff9 Filter based on procname Get rid of the filter based on the hostname since we don't have yet the required context in LTTng, but replace it with a filter on the procname (with follow-child support). This filter can be combined with the tid filter list and executing a binary as well. Signed-off-by: Julien Desfossez --- diff --git a/src/common.c b/src/common.c index 456e0a5..c752c74 100644 --- a/src/common.c +++ b/src/common.c @@ -758,3 +758,26 @@ void update_hostname_filter(struct host *host) } } } + +char *lookup_procname(const char *procname) +{ + if (!procname || !global_procname_list) + return NULL; + + return g_hash_table_lookup(global_procname_list, (gpointer) procname); +} + +char *add_procname_list(char *procname, int filter) +{ + char *proc; + + proc = lookup_procname(procname); + if (proc) + return proc; + + proc = strdup(procname); + g_hash_table_insert(global_procname_list, + (gpointer) procname, (gpointer) procname); + + return proc; +} diff --git a/src/common.h b/src/common.h index e21ece4..d3616a2 100644 --- a/src/common.h +++ b/src/common.h @@ -32,9 +32,10 @@ GPtrArray *copies; /* struct lttngtop */ GHashTable *global_perf_liszt; GHashTable *global_filter_list; GHashTable *global_host_list; +GHashTable *global_procname_list; char *opt_tid; -char *opt_hostname; +char *opt_procname; char *opt_relay_hostname; char *opt_kprobes; char *opt_exec_name; @@ -102,5 +103,7 @@ struct host *lookup_hostname_list(const char *hostname); int is_hostname_filtered(const char *hostname); struct host *add_hostname_list(char *hostname, int filter); void update_hostname_filter(struct host *host); +char *lookup_procname(const char *procname); +char *add_procname_list(char *procname, int filter); #endif /* _COMMON_H */ diff --git a/src/lttngtop.c b/src/lttngtop.c index 27bf8c8..be5af54 100644 --- a/src/lttngtop.c +++ b/src/lttngtop.c @@ -99,7 +99,7 @@ enum { OPT_TEXTDUMP, OPT_PID, OPT_CHILD, - OPT_HOSTNAME, + OPT_PROCNAME, OPT_RELAY_HOSTNAME, OPT_KPROBES, OPT_BEGIN, @@ -115,7 +115,7 @@ static struct poptOption long_options[] = { { "child", 'f', POPT_ARG_NONE, NULL, OPT_CHILD, NULL, NULL }, { "begin", 'b', POPT_ARG_NONE, NULL, OPT_BEGIN, NULL, NULL }, { "pid", 'p', POPT_ARG_STRING, &opt_tid, OPT_PID, NULL, NULL }, - { "hostname", 'n', POPT_ARG_STRING, &opt_hostname, OPT_HOSTNAME, NULL, NULL }, + { "procname", 'n', POPT_ARG_STRING, &opt_procname, OPT_PROCNAME, NULL, NULL }, { "relay-hostname", 'r', POPT_ARG_STRING, &opt_relay_hostname, OPT_RELAY_HOSTNAME, NULL, NULL }, { "kprobes", 'k', POPT_ARG_STRING, &opt_kprobes, OPT_KPROBES, NULL, NULL }, @@ -282,7 +282,7 @@ enum bt_cb_ret textdump(struct bt_ctf_event *call_data, void *private_data) lookup = pid; else lookup = tid; - if (opt_tid || opt_hostname || opt_exec_name) { + if (opt_tid || opt_procname || opt_exec_name) { if (!lookup_filter_tid_list(lookup)) { /* To display when a process of ours in getting scheduled in */ if (strcmp(bt_ctf_event_name(call_data), "sched_switch") == 0) { @@ -390,7 +390,7 @@ enum bt_cb_ret textdump(struct bt_ctf_event *call_data, void *private_data) (!current_syscall) ? '\n' : ' '); free(from_syscall); - if (opt_all && (opt_tid || opt_hostname || opt_exec_name)) + if (opt_all && (opt_tid || opt_procname || opt_exec_name)) fprintf(output, "%c[0m", 27); end: @@ -609,6 +609,17 @@ enum bt_cb_ret fix_process_table(struct bt_ctf_event *call_data, goto end; update_proc(child, pid, tid, ppid, vpid, vtid, vppid, comm, hostname); + if (opt_procname && lookup_procname(comm) && + !lookup_filter_tid_list(tid)) { + int *tmp_tid; + + tmp_tid = malloc(sizeof(int)); + *tmp_tid = tid; + printf("ADDING %s %d\n", comm, tid); + g_hash_table_insert(global_filter_list, + (gpointer) tmp_tid, tmp_tid); + } + if (pid != tid) { /* find or create the parent */ parent = find_process_tid(<tngtop, pid, comm); @@ -638,6 +649,7 @@ void init_lttngtop() global_perf_liszt = g_hash_table_new(g_str_hash, g_str_equal); global_filter_list = g_hash_table_new(g_str_hash, g_str_equal); global_host_list = g_hash_table_new(g_str_hash, g_str_equal); + global_procname_list = g_hash_table_new(g_str_hash, g_str_equal); tid_filter_list = g_hash_table_new(g_str_hash, g_str_equal); @@ -671,7 +683,7 @@ void usage(FILE *fp) fprintf(fp, " -t, --textdump Display live events in text-only\n"); fprintf(fp, " -p, --pid Comma-separated list of PIDs to display\n"); fprintf(fp, " -f, --child Follow threads associated with selected PIDs\n"); - fprintf(fp, " -n, --hostname Comma-separated list of hostnames to display (require hostname context in trace)\n"); + fprintf(fp, " -n, --procname Comma-separated list of procnames to display (require procname context in trace)\n"); fprintf(fp, " -a, --all In textdump mode, display all events but write in bold the processes we are interested in (-f, -p and -n)\n"); fprintf(fp, " -k, --kprobes Comma-separated list of kprobes to insert (same format as lttng enable-event)\n"); fprintf(fp, " -r, --relay-hostname Network live streaming : hostname of the lttng-relayd (default port)\n"); @@ -801,11 +813,11 @@ static int parse_options(int argc, char **argv) /* start reading the live trace from the beginning */ opt_begin = 1; break; - case OPT_HOSTNAME: + case OPT_PROCNAME: toggle_filter = 1; - tmp_str = strtok(opt_hostname, ","); + tmp_str = strtok(opt_procname, ","); while (tmp_str) { - add_hostname_list(tmp_str, 1); + add_procname_list(tmp_str, 1); tmp_str = strtok(NULL, ","); } break; diff --git a/utils/lttngtrace b/utils/lttngtrace index 835cb8d..5486d90 100755 --- a/utils/lttngtrace +++ b/utils/lttngtrace @@ -14,11 +14,12 @@ destroy() if test "$1" = "-h" -o "$1" = "--help"; then echo "usage : $0 [OPTIONS] [program [program-options]]" echo "OPTIONS :" - echo " -f, --child Follow threads associated with selected PIDs" - echo " -p, --pid Comma-separated list of PIDs to display (in addition to the executed program)" - echo " -a, --all In textdump mode, display all events but write in bold the processes we are interested in (-f and -p)" - echo " -k, --kprobes kprobes to insert (same format as lttng enable-event, can be repeated)" - echo " -o, --output In textdump, output the log in " + echo " -f Follow threads associated with selected PIDs" + echo " -p Comma-separated list of PIDs to display (in addition to the eventual executed program)" + echo " -n Comma-separated list of procnames to display (in addition to the eventual executed program)" + echo " -a In textdump mode, display all events but write in bold the processes we are interested in (-f and -p)" + echo " -k kprobes to insert (same format as lttng enable-event, can be repeated)" + echo " -o In textdump, output the log in " exit 0 fi @@ -103,6 +104,10 @@ while [ "$1" != "" ]; do shift LTTNGTOPARGS="$LTTNGTOPARGS -o $1" shift + elif test "$1" = "-n"; then + shift + LTTNGTOPARGS="$LTTNGTOPARGS -n $1" + shift elif test "${1:0:1}" = "-"; then LTTNGTOPARGS="$LTTNGTOPARGS $1" shift