diff options
author | Francois-Xavier Le Bail <devel.fx.lebail@orange.fr> | 2023-03-13 11:19:31 +0100 |
---|---|---|
committer | Francois-Xavier Le Bail <devel.fx.lebail@orange.fr> | 2023-03-13 15:43:02 +0100 |
commit | 51fb0c5bde8d01f9df0e495e1b62af6579932bb5 (patch) | |
tree | 0047e6d9eb1a1a1b19c2e3e1bb5350b30b471476 | |
parent | 989e1947f418e501bcea4d2cee1a986b455fe173 (diff) | |
download | libpcap-51fb0c5bde8d01f9df0e495e1b62af6579932bb5.tar.gz |
instrument functions: Use an environment variable instead of config files
If the environment variable INSTRUMENT is
- unset or set to an empty string, print nothing, like with no
instrumentation
- set to "all" or "a", print all the functions names
- set to "global" or "g", print only the global functions names
The configuration with --enable-instrument-functions remains.
Note that before this change, the default was to print all functions.
Now it is to print nothing.
This allows to run with tcpdump, tcpslice or any program linked
to libpcap:
$ INSTRUMENT=a ./my_program ...
$ INSTRUMENT=g ./my_program ...
$ INSTRUMENT= ./my_program ...
or
$ export INSTRUMENT=global
$ ./my_program ...
This also allows to run the statically compiled binary on another host
after copying it.
Moreover:
Reduce the scope of a variable.
Rename a variable.
Remove '\n' in the perror() call.
Remove 2 spaces in function calls (style).
(Same as in tcpdump and tcpslice.)
[skip ci]
-rw-r--r-- | instrument-functions.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/instrument-functions.c b/instrument-functions.c index 32349772..350a1682 100644 --- a/instrument-functions.c +++ b/instrument-functions.c @@ -14,8 +14,6 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> #include <unistd.h> #include <bfd.h> @@ -33,14 +31,10 @@ * If entering in a function it prints also the calling function name with * file name and line number. * - * To configure the printing of only the global functions names: - * $ make instrument_global - * - * To go back to print all the functions names: - * $ make instrument_all - * - * To print nothing, like with no instrumentation: - * $ make instrument_off + * If the environment variable INSTRUMENT is + * unset or set to an empty string, print nothing, like with no instrumentation + * set to "all" or "a", print all the functions names + * set to "global" or "g", print only the global functions names */ #define ND_NO_INSTRUMENT __attribute__((no_instrument_function)) @@ -73,12 +67,6 @@ __cyg_profile_func_exit(void *this_fn, void *call_site) print_debug(this_fn, call_site, EXIT); } -/* If this file exists, print only the global functions */ -#define ND_FILE_FLAG_GLOBAL "instrument_functions_global.devel" - -/* If this file exists, print nothing, like with no instrumentation */ -#define ND_FILE_FLAG_OFF "instrument_functions_off.devel" - static void print_debug(void *this_fn, void *call_site, action_type action) { static bfd* abfd; @@ -86,32 +74,45 @@ static void print_debug(void *this_fn, void *call_site, action_type action) static long symcount; static asection *text; static bfd_vma vma; + static char *instrument_type; + static int instrument_set; static int instrument_off; - static int print_only_global; - symbol_info syminfo; - struct stat statbuf; + static int instrument_global; int i; - if (!instrument_off) { - /* one-time test */ - if (!stat(ND_FILE_FLAG_OFF, &statbuf)) { + if (!instrument_set) { + /* Get the configuration environment variable INSTRUMENT value if any */ + instrument_type = getenv("INSTRUMENT"); + /* unset or set to an empty string ? */ + if (instrument_type == NULL || + !strncmp(instrument_type, "", sizeof(""))) { instrument_off = 1; - return; + } else { + /* set to "global" or "g" ? */ + if (!strncmp(instrument_type, "global", sizeof("global")) || + !strncmp(instrument_type, "g", sizeof("g"))) + instrument_global = 1; + else if (strncmp(instrument_type, "all", sizeof("all")) && + strncmp(instrument_type, "a", sizeof("a"))) { + fprintf(stderr, "INSTRUMENT can be only \"\", \"all\", \"a\", " + "\"global\" or \"g\".\n"); + exit(1); + } } - } else - return; + instrument_set = 1; + } + + if (instrument_off) + return; /* If no errors, this block should be executed one time */ if (!abfd) { char pgm_name[1024]; long symsize; - if (!stat(ND_FILE_FLAG_GLOBAL, &statbuf)) - print_only_global = 1; - ssize_t ret = readlink("/proc/self/exe", pgm_name, sizeof(pgm_name)); if (ret == -1) { - perror("failed to find executable\n"); + perror("failed to find executable"); return; } if (ret == sizeof(pgm_name)) { @@ -142,8 +143,8 @@ static void print_debug(void *this_fn, void *call_site, action_type action) symtab = (asymbol **)malloc(symsize); symcount = bfd_canonicalize_symtab(abfd, symtab); if (symcount < 0) { - free (symtab); - bfd_perror ("bfd_canonicalize_symtab"); + free(symtab); + bfd_perror("bfd_canonicalize_symtab"); return; } @@ -154,7 +155,8 @@ static void print_debug(void *this_fn, void *call_site, action_type action) vma = text->vma; } - if (print_only_global) { + if (instrument_global) { + symbol_info syminfo; int found; i = 0; |