On Wed, Oct 13, 2010 at 9:39 PM, Artur Skawina art.08.09@gmail.com wrote:
Wanted to use latrace on an app that was using setjmp/longjmp; and to avoid latrace causing a crash had to use the patch below.
"latrace -Ap -n setjmp ..." was enough to make things work.
hi, I was just working on a glibc fix for auditing vfork and sig/setjmp functions ;) this is good workaround
While doing this noticed the LA_SYMB_NOPLTEXIT omission for the '-s syms' case; not knowing if that was intentional i did not change that.
yea, I probably overlooked that.. however I checked glibc source and once you return LA_SYMB_NOPLTENTER, pltexit is never called anyway.. but I added it just in case glibc will fix this in the future.. thanks for noticing
it's nice to see someone is actually using this ;) thanks jirka
ps ccing latrace list
artur
From: Artur Skawina art.08.09@gmail.com Date: Wed, 13 Oct 2010 18:42:57 +0000 Subject: [PATCH] Add '-n' option, allowing to skip tracing certain symbols
Makes it possible omit tracing just some calls, like 'setjmp'.
doc/latrace.txt | 5 ++++- src/audit-init.c | 7 +++++++ src/audit.c | 5 +++++ src/config.c | 11 ++++++++++- src/config.h | 4 ++++ 5 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/doc/latrace.txt b/doc/latrace.txt index b24742a..ab2044d 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, --omit-sym sym1[,sym2,...]*::
- omit symbols sym1, sym2 ...
*-S, --timestamp*:: display timestamp for each symbol
diff --git a/src/audit-init.c b/src/audit-init.c index 81ab1e5..322efe0 100644 --- a/src/audit-init.c +++ b/src/audit-init.c @@ -189,6 +189,13 @@ int audit_init(int argc, char **argv, char **env) return -1; }
- /* -n */
- if ((*lt_sh(&cfg, skipsymbols)) &&
- (-1 == (cfg.skipsymbols_cnt = get_names(&cfg, lt_sh(&cfg, skipsymbols), cfg.skipsymbols)))) {
- 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)))) { diff --git a/src/audit.c b/src/audit.c index 2a97b75..2494d93 100644 --- a/src/audit.c +++ b/src/audit.c @@ -234,6 +234,11 @@ static unsigned int la_symbind(const char *symname) flags = 0; }
- if (cfg.skipsymbols_cnt) {
- if (check_names((char*) symname, cfg.skipsymbols))
- flags = LA_SYMB_NOPLTENTER|LA_SYMB_NOPLTEXIT;
- }
return flags; }
diff --git a/src/config.c b/src/config.c index 3f3145c..ba222d3 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, --omit-sym 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'},
- {"omit-sym", 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, skipsymbols), 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..71f319a 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 skipsymbols[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 *skipsymbols[LT_NAMES_MAX];
- int skipsymbols_cnt;
char *flow_below[LT_NAMES_MAX]; int flow_below_cnt;
--