diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-10-13 23:21:03 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-10-13 23:21:03 +0200 |
commit | 961effe04468136a09f148ceb9c436fdb5934be2 (patch) | |
tree | 44b4f0f2230f7b84ccc29e3b5dd523374bd3acdf | |
parent | b6e8cd4e36f4b1ad5f2ace7f0d145b11d083f4b8 (diff) | |
download | latrace-961effe04468136a09f148ceb9c436fdb5934be2.tar.gz latrace-961effe04468136a09f148ceb9c436fdb5934be2.tar.xz latrace-961effe04468136a09f148ceb9c436fdb5934be2.zip |
Artur Skawina <art.08.09@gmail.com>
add '-n' option, allowing to omit tracing certain symbols
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | doc/latrace.txt | 6 | ||||
-rw-r--r-- | src/audit-init.c | 23 | ||||
-rw-r--r-- | src/audit.c | 7 | ||||
-rw-r--r-- | src/config.c | 11 | ||||
-rw-r--r-- | src/config.h | 4 |
6 files changed, 47 insertions, 8 deletions
@@ -1,3 +1,7 @@ +2010-10-13 Jiri Olsa <olsajiri@gmail.com> + * Artur Skawina <art.08.09@gmail.com> + - add '-n' option, allowing to omit tracing certain symbols + 2010-10-02 Jiri Olsa <olsajiri@gmail.com> * Akos Pasztory <akos.pasztory@gmail.com> - more sophisticated parsing of /proc/self/maps diff --git a/doc/latrace.txt b/doc/latrace.txt index b24742a..c22e188 100644 --- a/doc/latrace.txt +++ b/doc/latrace.txt @@ -10,7 +10,7 @@ latrace - LD_AUDIT 2.4+ libc frontend SYNOPSIS -------- -*latrace* [-ltfsbcCpADaoyIiBdvTFELVh] command [arg ... ] +*latrace* [-ltfsnbcCpADaoyIiBdvTFELVh] command [arg ... ] DESCRIPTION @@ -45,6 +45,9 @@ OPTIONS *-s, --sym sym1[,sym2,...]*:: audit symbols sym1, sym2 ... +*-n, --sym-omit sym1[,sym2,...]*:: + omit symbols sym1, sym2 ... + *-S, --timestamp*:: display timestamp for each symbol @@ -434,6 +437,7 @@ CONTRIBUTORS ------------ - Nix <nix@esperi.org.uk> - Akos Pasztory <akos.pasztory@gmail.com> +- Artur Skawina <art.08.09@gmail.com> LICENSE diff --git a/src/audit-init.c b/src/audit-init.c index 81ab1e5..686c56d 100644 --- a/src/audit-init.c +++ b/src/audit-init.c @@ -163,35 +163,48 @@ int audit_init(int argc, char **argv, char **env) /* -t */ if ((*lt_sh(&cfg, libs_to)) && - (-1 == (cfg.libs_to_cnt = get_names(&cfg, lt_sh(&cfg, libs_to), cfg.libs_to)))) { + (-1 == (cfg.libs_to_cnt = get_names(&cfg, lt_sh(&cfg, libs_to), + cfg.libs_to)))) { printf("latrace failed to parse libs to\n"); return -1; } /* -f */ if ((*lt_sh(&cfg, libs_from)) && - (-1 == (cfg.libs_from_cnt = get_names(&cfg, lt_sh(&cfg, libs_from), cfg.libs_from)))) { + (-1 == (cfg.libs_from_cnt = get_names(&cfg, lt_sh(&cfg, libs_from), + cfg.libs_from)))) { printf("latrace failed to parse libs from\n"); return -1; } /* -l */ if ((*lt_sh(&cfg, libs_both)) && - (-1 == (cfg.libs_both_cnt = get_names(&cfg, lt_sh(&cfg, libs_both), cfg.libs_both)))) { + (-1 == (cfg.libs_both_cnt = get_names(&cfg, lt_sh(&cfg, libs_both), + cfg.libs_both)))) { printf("latrace failed to parse libs from\n"); return -1; } /* -s */ if ((*lt_sh(&cfg, symbols)) && - (-1 == (cfg.symbols_cnt = get_names(&cfg, lt_sh(&cfg, symbols), cfg.symbols)))) { + (-1 == (cfg.symbols_cnt = get_names(&cfg, lt_sh(&cfg, symbols), + cfg.symbols)))) { printf("latrace failed to parse symbols\n"); return -1; } + /* -n */ + if ((*lt_sh(&cfg, symbols_omit)) && + (-1 == (cfg.symbols_omit_cnt = get_names(&cfg, lt_sh(&cfg, symbols_omit), + cfg.symbols_omit)))) { + printf("latrace failed to parse symbols to omit\n"); + return -1; + } + /* -b */ if ((*lt_sh(&cfg, flow_below)) && - (-1 == (cfg.flow_below_cnt = get_names(&cfg, lt_sh(&cfg, flow_below), cfg.flow_below)))) { + (-1 == (cfg.flow_below_cnt = get_names(&cfg, lt_sh(&cfg, flow_below), + cfg.flow_below)))) { printf("latrace failed to parse symbols in flow-below option\n"); return -1; } diff --git a/src/audit.c b/src/audit.c index 2a97b75..03e0c48 100644 --- a/src/audit.c +++ b/src/audit.c @@ -229,11 +229,16 @@ static unsigned int la_symbind(const char *symname) unsigned int flags = 0; if (cfg.symbols_cnt) { - flags = LA_SYMB_NOPLTENTER; + flags = LA_SYMB_NOPLTENTER|LA_SYMB_NOPLTEXIT; if (check_names((char*) symname, cfg.symbols)) flags = 0; } + if (cfg.symbols_omit_cnt) { + if (check_names((char*) symname, cfg.symbols_omit)) + flags = LA_SYMB_NOPLTENTER|LA_SYMB_NOPLTEXIT; + } + return flags; } diff --git a/src/config.c b/src/config.c index 3f3145c..3cf734b 100644 --- a/src/config.c +++ b/src/config.c @@ -34,6 +34,7 @@ static void usage() printf(" -t, --libs-to lib1,lib2... audit to lib1, lib2 ...\n"); printf(" -f, --libs-from lib1,lib2... audit from lib1, lib2 ...\n"); printf(" -s, --sym sym1,sym2... audit symbols sym1, sym2 ... \n"); + printf(" -n, --sym-omit sym1,sym2... omit symbols sym1, sym2 ... \n"); printf(" -L, --lib-subst s1,s2... objsearch LD_AUDIT interface (see man page)\n"); printf("\n"); printf(" -c, --counts display statistics counts of symbols\n"); @@ -127,6 +128,7 @@ int lt_config(struct lt_config_app *cfg, int argc, char **argv) int option_index = 0; static struct option long_options[] = { {"sym", required_argument, 0, 's'}, + {"sym-omit", required_argument, 0, 'n'}, {"libs", required_argument, 0, 'l'}, {"libs-to", required_argument, 0, 't'}, {"libs-from", required_argument, 0, 'f'}, @@ -157,7 +159,7 @@ int lt_config(struct lt_config_app *cfg, int argc, char **argv) {0, 0, 0, 0} }; - c = getopt_long(argc, argv, "+s:l:t:f:vhi:BdISb:cC:y:YL:po:a:ADVTFERq", + c = getopt_long(argc, argv, "+s:n:l:t:f:vhi:BdISb:cC:y:YL:po:a:ADVTFERq", long_options, &option_index); if (c == -1) @@ -192,6 +194,13 @@ int lt_config(struct lt_config_app *cfg, int argc, char **argv) strncpy(lt_sh(cfg, symbols), optarg, strlen(optarg)); break; + case 'n': + if (strlen(optarg) > LT_SYMBOLS_MAXSIZE) + return -1; + + strncpy(lt_sh(cfg, symbols_omit), optarg, strlen(optarg)); + break; + case 'b': if (strlen(optarg) > LT_SYMBOLS_MAXSIZE) return -1; diff --git a/src/config.h b/src/config.h index 2a36c58..29c9c4f 100644 --- a/src/config.h +++ b/src/config.h @@ -84,6 +84,7 @@ struct lt_config_shared { #define LT_SYMBOLS_MAXSIZE 200 char symbols[LT_SYMBOLS_MAXSIZE]; + char symbols_omit[LT_SYMBOLS_MAXSIZE]; char flow_below[LT_SYMBOLS_MAXSIZE]; @@ -186,6 +187,9 @@ struct lt_config_audit { char *symbols[LT_NAMES_MAX]; int symbols_cnt; + char *symbols_omit[LT_NAMES_MAX]; + int symbols_omit_cnt; + char *flow_below[LT_NAMES_MAX]; int flow_below_cnt; |