[PATCH v3] Implement -e trace=/regex option
Dmitry V. Levin
ldv at altlinux.org
Wed Apr 12 21:10:48 UTC 2017
On Wed, Apr 12, 2017 at 09:31:51PM +0800, JingPiao Chen wrote:
> * qualify.c (qualify_syscall_regex): New function.
It should bein with
* qualify.c: Include <regex.h>
> (qualify_syscall_name): Use qualify_syscall_regex function.
Use it?
> * strace.1: Document it.
What's "it"?
> * NEWS: Mention this.
Mention what?
> * tests/regex.test: Check this.
New file?
> * tests/Makefile.am (DECODER_TESTS): Add regex.test.
Add it?
> * tests/options-syntax.test:
> Add check for invaild regexp and the regexp never match a syscall.
grammar: and for regexp that doesn't match a syscall.
> --- a/NEWS
> +++ b/NEWS
> @@ -12,6 +12,7 @@ Noteworthy changes in release ?.?? (????-??-??)
> * Added -e trace=%clock option for tracing clock_* syscalls.
> * Added -e trace=%statfs option for tracing statfs, statfs64 and statvfs
> syscalls.
> + * Added -e trace=/regex option for tracing match regular expression syscalls.
grammar: for filtering syscalls using regular expressions.
> @@ -198,6 +199,48 @@ qualify_syscall_number(const char *s, struct number_set *set)
> return done;
> }
>
> +static bool
> +qualify_syscall_regex(const char *s, struct number_set *set)
> +{
> + regex_t preg;
> + int rc;
> +
> + if ((rc = regcomp(&preg, s, REG_EXTENDED | REG_NOSUB)) != 0) {
> + size_t len = regerror(rc, &preg, NULL, 0);
> + char buf[len];
We don't use VLA on the stack, it is not portable. In particular,
it won't pass travis-ci clang tests. If you've pushed it to github
and enabled travis-ci, you'd have noticed.
Why do you need it here?
> + regerror(rc, &preg, buf, len);
> + error_msg_and_die("regcomp: '%s' (%s)", s, buf);
regcomp: %s: %s
> + }
> +
> + unsigned int p;
> + bool found = false;
> + for (p = 0; p < SUPPORTED_PERSONALITIES; ++p) {
> + unsigned int i;
> +
> + for (i = 0; i < nsyscall_vec[p]; ++i) {
> + if (!sysent_vec[p][i].sys_name)
> + continue;
> + rc = regexec(&preg, sysent_vec[p][i].sys_name,
> + 0, NULL, 0);
> + if (rc == REG_NOMATCH)
> + continue;
> + else if (rc) {
> + size_t len = regerror(rc, &preg, NULL, 0);
> + char buf[len];
> +
> + regerror(rc, &preg, buf, len);
> + error_msg_and_die("regexec: '%s' (%s)", s, buf);
This error diagnostics looks very similar to the regcomp case.
Let's move it to a separate function.
> --- a/strace.1
> +++ b/strace.1
> @@ -383,6 +383,15 @@ about the user/kernel boundary if only a subset of system calls
> are being monitored. The default is
> .BR trace = all .
> .PP
> +.TP
Shouldn't it be just .TP without .PP?
> +.BR "\-e\ trace" = /regex
\fB\-e\ trace\fR=/\,\fIregex\fR
> +Trace only the system calls match the
grammar: Trace only those system calls that match the
> +.BR regex .
.IR regex .
> --- a/tests/options-syntax.test
> +++ b/tests/options-syntax.test
> @@ -72,6 +72,7 @@ check_e "invalid system call '-2'" -e -2
> check_e "invalid system call '-3'" -etrace=-3
> check_e "invalid system call '-4'" -e trace=-4
> check_e "invalid system call '-5'" -e trace=1,-5
> +check_e "invalid system call '/non_syscall'" -e trace=/non_syscall
> check_e "invalid system call '2147483647'" -e 2147483647
> check_e "invalid system call '2147483648'" -e 2147483648
> check_e "invalid system call '4294967295'" -e 4294967295
> @@ -144,3 +145,24 @@ done
> [ -z "$args" ] ||
> dump_log_and_fail_with \
> "strace $args failed to print expected diagnostics"
> +
> +# Check regular expression
> +# ignore the error message print by library function
> +check_regex_e()
> +{
> + local pattern="$1"; shift
> + cat > "$EXP" << __EOF__
> +$strace_exp: $pattern
> +__EOF__
> + $STRACE "$@" 2> "$LOG" &&
> + dump_log_and_fail_with \
> + "strace $* failed to handle the error properly"
> + match_grep "$LOG" "$EXP" ||
> + dump_log_and_fail_with \
> + "strace $* failed to print expected diagnostics"
> +}
There is nothing about regex in this function besides its name,
the only difference from check_e is that it uses match_grep instead
of match_diff, so please give it a more appropriate name and description.
Also, please move it between check_e and check_h.
> +check_regex_e "regcomp: '\?id' \(.*\)$" -e trace='/?id'
What's the use of adding this funny tail \(.*\)$ ?
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170413/7754671a/attachment.bin>
More information about the Strace-devel
mailing list