[PATCH v7 8/8] Add stacktrace filter action

Eugene Syromiatnikov esyr at redhat.com
Mon Aug 14 02:16:22 UTC 2017


On Fri, Aug 11, 2017 at 05:43:53PM +0700, Nikolay Marchuk wrote:
> * defs.h (QUAL_STACKTRACE): Add new qual flag.
> (stacktrace): Add macro for checking QUAL_STACKTRACE.
> (stack_trace_enabled): Change description.
> * filter_action.c (action_types): Declare and add new filter action type.
> (update_default_flags): Update stack_trace_enabled.
> * strace.c (stack_trace_enabled): Change description.
> (init): Use filtering_parse for -k option.
> * syscall.c (syscall_entering_trace, syscall_exiting_decode,
> syscall_exiting_trace): Use stacktrace macro instead of
> stack_trace_enabled.
> * unwind.c (apply_stacktrace): Add filter action function.
> ---
>  defs.h          |  6 +++++-
>  filter_action.c | 11 +++++++++++
>  strace.c        |  4 ++--
>  syscall.c       |  6 +++---
>  unwind.c        |  6 ++++++
>  5 files changed, 27 insertions(+), 6 deletions(-)
> 
> diff --git a/defs.h b/defs.h
> index 13893f64..8604651a 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -271,6 +271,9 @@ struct tcb {
>  #define QUAL_SIGNAL	0x100	/* report events with this signal */
>  #define QUAL_READ	0x200	/* dump data read in this syscall */
>  #define QUAL_WRITE	0x400	/* dump data written in this syscall */
> +#ifdef USE_LIBUNWIND
> +# define QUAL_STACKTRACE	0x800	/* do the stack trace */
> +#endif
>  
>  #define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
>  
> @@ -281,6 +284,7 @@ struct tcb {
>  #define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
>  #define dump_read(tcp)	((tcp)->qual_flg & QUAL_READ)
>  #define dump_write(tcp)	((tcp)->qual_flg & QUAL_WRITE)
> +#define stacktrace(tcp)	((tcp)->qual_flg & QUAL_STACKTRACE)
>  #define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
>  #define hide_log(tcp)	((tcp)->flags & TCB_HIDE_LOG)
>  
> @@ -383,7 +387,7 @@ extern struct path_set {
>  extern unsigned xflag;
>  extern unsigned followfork;
>  #ifdef USE_LIBUNWIND
> -/* if this is true do the stack trace for every system call */
> +/* if this is true do the initialization of stack trace mechanism */
"stack tracing"

>  extern bool stack_trace_enabled;
>  #endif
>  extern unsigned ptrace_setoptions;
> diff --git a/filter_action.c b/filter_action.c
> index 776ffded..2cffe7a2 100644
> --- a/filter_action.c
> +++ b/filter_action.c
> @@ -41,6 +41,9 @@ DECL_FILTER_ACTION(write);
>  DECL_FILTER_ACTION(raw);
>  DECL_FILTER_ACTION(abbrev);
>  DECL_FILTER_ACTION(verbose);
> +# ifdef USE_LIBUNWIND
> +DECL_FILTER_ACTION(stacktrace);
> +# endif
>  #undef DECL_FILTER_ACTION
>  
>  extern bool is_traced(struct tcb *);
> @@ -81,6 +84,9 @@ static const struct filter_action_type {
>  	FILTER_ACTION_TYPE(raw,		2, QUAL_RAW,		null,	is_traced),
>  	FILTER_ACTION_TYPE(abbrev,	2, QUAL_ABBREV,		null,	is_traced),
>  	FILTER_ACTION_TYPE(verbose,	2, QUAL_VERBOSE,	null,	is_traced),
> +# ifdef USE_LIBUNWIND
> +	FILTER_ACTION_TYPE(stacktrace,	2, QUAL_STACKTRACE,	null,	is_traced),
> +# endif
>  };
>  #undef FILTER_ACTION_TYPE
>  
> @@ -163,6 +169,11 @@ add_action(const struct filter_action_type *type)
>  	/* Update default_flags */
>  	if (default_flags & type->qual_flg)
>  		default_flags &= ~type->qual_flg;
> +	/* Enable stack tracing. */
> +#ifdef USE_LIBUNWIND
> +	if (type->qual_flg & QUAL_STACKTRACE)
> +		stack_trace_enabled = true;
> +#endif
>  
>  	filter_actions = xreallocarray(filter_actions, ++nfilter_actions,
>  				       sizeof(struct filter_action));
> diff --git a/strace.c b/strace.c
> index 79c5397e..d2011d0c 100644
> --- a/strace.c
> +++ b/strace.c
> @@ -56,7 +56,7 @@ extern int optind;
>  extern char *optarg;
>  
>  #ifdef USE_LIBUNWIND
> -/* if this is true do the stack trace for every system call */
> +/* if this is true do the initialization of stack trace mechanism */
"stack tracing"

>  bool stack_trace_enabled;
>  #endif
>  
> @@ -1693,7 +1693,7 @@ init(int argc, char *argv[])
>  			break;
>  #ifdef USE_LIBUNWIND
>  		case 'k':
> -			stack_trace_enabled = true;
> +			filtering_parse("stacktrace(syscall all)");
>  			break;
>  #endif
>  		case 'E':
> diff --git a/syscall.c b/syscall.c
> index b740dadb..ed463f92 100644
> --- a/syscall.c
> +++ b/syscall.c
> @@ -686,7 +686,7 @@ syscall_entering_trace(struct tcb *tcp, unsigned int *sig)
>  	}
>  
>  #ifdef USE_LIBUNWIND
> -	if (stack_trace_enabled) {
> +	if (stacktrace(tcp)) {
>  		if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER)
>  			unwind_capture_stacktrace(tcp);
>  	}
> @@ -732,7 +732,7 @@ syscall_exiting_decode(struct tcb *tcp, struct timeval *ptv)
>  		gettimeofday(ptv, NULL);
>  
>  #ifdef USE_LIBUNWIND
> -	if (stack_trace_enabled) {
> +	if (stacktrace(tcp)) {
>  		if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE)
>  			unwind_cache_invalidate(tcp);
>  	}
> @@ -952,7 +952,7 @@ syscall_exiting_trace(struct tcb *tcp, struct timeval tv, int res)
>  	line_ended();
>  
>  #ifdef USE_LIBUNWIND
> -	if (stack_trace_enabled)
> +	if (stacktrace(tcp))
>  		unwind_print_stacktrace(tcp);
>  #endif
>  	return 0;
> diff --git a/unwind.c b/unwind.c
> index 919b63c3..caab4143 100644
> --- a/unwind.c
> +++ b/unwind.c
> @@ -589,3 +589,9 @@ unwind_capture_stacktrace(struct tcb *tcp)
>  		DPRINTF("tcp=%p, queue=%p", "captured", tcp, tcp->queue->head);
>  	}
>  }
> +
> +void
> +apply_stacktrace(struct tcb *tcp, void *_priv_data)
> +{
> +	tcp->qual_flg |= QUAL_STACKTRACE;
> +}
> -- 
> 2.11.0




More information about the Strace-devel mailing list