On Wed, Oct 13, 2010 at 9:39 PM, Artur Skawina <art.08.09(a)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(a)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;
--