summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-10-13 23:21:03 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-10-13 23:21:03 +0200
commit961effe04468136a09f148ceb9c436fdb5934be2 (patch)
tree44b4f0f2230f7b84ccc29e3b5dd523374bd3acdf
parentb6e8cd4e36f4b1ad5f2ace7f0d145b11d083f4b8 (diff)
downloadlatrace-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--ChangeLog4
-rw-r--r--doc/latrace.txt6
-rw-r--r--src/audit-init.c23
-rw-r--r--src/audit.c7
-rw-r--r--src/config.c11
-rw-r--r--src/config.h4
6 files changed, 47 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 600f752..ef2ac14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;