* 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 de9d60e2..e1df8090 100644 --- a/defs.h +++ b/defs.h @@ -257,6 +257,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) @@ -270,6 +273,7 @@ struct tcb { #define inject(tcp) ((tcp)->qual_flg & QUAL_INJECT) #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) @@ -375,7 +379,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 tracing mechanism */ extern bool stack_trace_enabled; #endif extern unsigned ptrace_setoptions; diff --git a/filter_action.c b/filter_action.c index 697a71ce..85c296e1 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 *); @@ -77,6 +80,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 @@ -173,6 +179,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 eb2665a5..0e27a9ef 100644 --- a/strace.c +++ b/strace.c @@ -57,7 +57,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 tracing mechanism */ bool stack_trace_enabled; #endif @@ -1694,7 +1694,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 492858ca..41245e13 100644 --- a/syscall.c +++ b/syscall.c @@ -687,7 +687,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 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel