[PATCH/RFC v1 1/2] [GSoC] Stop condition based on number of syscalls

Masatake YAMATO yamato at redhat.com
Tue Feb 14 23:04:22 UTC 2023


> Add option to detach strace after capturing a specified
> number of syscalls.
> 
> * src/strace.c: Implementation of -l/--syscall-limit option
> 
> Signed-off-by: Sahil Siddiq <icegambit91 at gmail.com>
> ---
>  src/strace.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/src/strace.c b/src/strace.c
> index 4e710db80..bdfa705cf 100644
> --- a/src/strace.c
> +++ b/src/strace.c
> @@ -84,6 +84,7 @@ int Tflag_scale = 1000;
>  int Tflag_width = 6;
>  bool iflag;
>  bool nflag;
> +int syscall_limit = -1;

If you don't have a plan to refer to this variable in .c files other than strace.c,
you can add static modifier.

It seems that my comment is applicable to nflag.

Masatake YAMATO

>  bool count_wallclock;
>  static int tflag_scale = 1000000000;
>  static unsigned tflag_width = 0;
> @@ -461,6 +462,10 @@ Statistics:\n\
>    -w, --summary-wall-clock\n\
>                   summarise syscall latency (default is system time)\n\
>  \n\
> +Stop condition:\n\
> +  -l LIMIT, --syscall-limit=LIMIT\n\
> +                 Detach tracer after tracing LIMIT syscalls\n\
> +\n\
>  Tampering:\n\
>    -e inject=SET[:error=ERRNO|:retval=VALUE][:signal=SIG][:syscall=SYSCALL]\n\
>              [:delay_enter=DELAY][:delay_exit=DELAY]\n\
> @@ -2245,7 +2250,7 @@ init(int argc, char *argv[])
>  #endif
>  
>  	static const char optstring[] =
> -		"+a:Ab:cCdDe:E:fFhiI:kno:O:p:P:qrs:S:tTu:U:vVwxX:yYzZ";
> +		"+a:Ab:cCdDe:E:fFhiI:kl:no:O:p:P:qrs:S:tTu:U:vVwxX:yYzZ";
>  
>  	enum {
>  		GETOPT_SECCOMP = 0x100,
> @@ -2291,6 +2296,7 @@ init(int argc, char *argv[])
>  		{ "instruction-pointer", no_argument,      0, 'i' },
>  		{ "interruptible",	required_argument, 0, 'I' },
>  		{ "stack-traces",	no_argument,	   0, 'k' },
> +		{ "syscall-limit",	required_argument, 0, 'l' },
>  		{ "syscall-number",	no_argument,	   0, 'n' },
>  		{ "output",		required_argument, 0, 'o' },
>  		{ "summary-syscall-overhead", required_argument, 0, 'O' },
> @@ -2432,6 +2438,11 @@ init(int argc, char *argv[])
>  					  "build of strace");
>  #endif
>  			break;
> +		case 'l':
> +			syscall_limit = string_to_uint(optarg);
> +			if (syscall_limit <= 0)
> +				error_opt_arg(c, lopt, optarg);
> +			break;
>  		case 'n':
>  			nflag = 1;
>  			break;
> @@ -3646,6 +3657,8 @@ trace_syscall(struct tcb *tcp, unsigned int *sig)
>  		int res = syscall_exiting_decode(tcp, &ts);
>  		if (res != 0) {
>  			res = syscall_exiting_trace(tcp, &ts, res);
> +			if (syscall_limit != -1)
> +				syscall_limit--;
>  		}
>  		syscall_exiting_finish(tcp);
>  		return res;
> @@ -3716,6 +3729,8 @@ dispatch_event(const struct tcb_wait_data *wd)
>  			 */
>  			return true;
>  		}
> +		if (syscall_limit == 0)
> +			return false;
>  		if (has_seccomp_filter(current_tcp)) {
>  			/*
>  			 * Syscall and seccomp stops can happen in different
> -- 
> 2.39.1
> 
> -- 
> Strace-devel mailing list
> Strace-devel at lists.strace.io
> https://lists.strace.io/mailman/listinfo/strace-devel
> 



More information about the Strace-devel mailing list