diff options
author | Masatake YAMATO <yamato@redhat.com> | 2014-04-16 15:33:35 +0900 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2014-05-30 22:59:01 +0000 |
commit | ed69fc2dc3da87d337ddd02f9153a82a46196cdf (patch) | |
tree | 580ef9ddeeea6c7352c4a820a8850452eebcb592 | |
parent | 549e2c4a9858a380b03eb6e2ff4861d2c6687d6a (diff) | |
download | strace-ed69fc2dc3da87d337ddd02f9153a82a46196cdf.tar.gz |
unwind: move stacktrace capturing and mmap cache invalidating to trace_syscall_entering
Instead of handling stacktrace capturing and mmap cache invalidating in
sys_* functions, handle them uniformly in trace_syscall_entering using
new flags introduced by previous two commits.
The patch is simpler than its older version(v3). The value of
hide_log_until_execve is just ignored. I found the value is nothing
to do with this patch. unwind_cache_invalidate is mentioned only
once in trace_syscall_exiting.
Both are suggested by Dmitry Levin.
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
-rw-r--r-- | mem.c | 27 | ||||
-rw-r--r-- | process.c | 13 | ||||
-rw-r--r-- | syscall.c | 14 |
3 files changed, 14 insertions, 40 deletions
@@ -60,13 +60,6 @@ static int print_mmap(struct tcb *tcp, long *u_arg, unsigned long long offset) { if (entering(tcp)) { -#ifdef USE_LIBUNWIND - if (stack_trace_enabled) { - unwind_capture_stacktrace(tcp); - unwind_cache_invalidate(tcp); - } -#endif - /* addr */ if (!u_arg[0]) tprints("NULL, "); @@ -195,17 +188,7 @@ sys_munmap(struct tcb *tcp) if (entering(tcp)) { tprintf("%#lx, %lu", tcp->u_arg[0], tcp->u_arg[1]); -#ifdef USE_LIBUNWIND - if (stack_trace_enabled) - unwind_capture_stacktrace(tcp); -#endif - } -#ifdef USE_LIBUNWIND - else { - if (stack_trace_enabled) - unwind_cache_invalidate(tcp); } -#endif return 0; } @@ -216,17 +199,7 @@ sys_mprotect(struct tcb *tcp) tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]); printflags(mmap_prot, tcp->u_arg[2], "PROT_???"); -#ifdef USE_LIBUNWIND - if (stack_trace_enabled) - unwind_capture_stacktrace(tcp); -#endif } -#ifdef USE_LIBUNWIND - else { - if (stack_trace_enabled) - unwind_cache_invalidate(tcp); - } -#endif return 0; } @@ -798,20 +798,7 @@ sys_execve(struct tcb *tcp) printargv(tcp, tcp->u_arg[2]); tprints("]"); } -#ifdef USE_LIBUNWIND - if (stack_trace_enabled) { - unwind_capture_stacktrace(tcp); - } -#endif } -#ifdef USE_LIBUNWIND - else { - if (stack_trace_enabled) { - unwind_cache_invalidate(tcp); - } - } -#endif - return 0; } @@ -2040,6 +2040,13 @@ trace_syscall_entering(struct tcb *tcp) goto ret; } +#ifdef USE_LIBUNWIND + if (stack_trace_enabled) { + if (tcp->s_ent->sys_flags & STACKTRACE_CAPTURE_ON_ENTER) + unwind_capture_stacktrace(tcp); + } +#endif + printleader(tcp); if (tcp->qual_flg & UNDEFINED_SCNO) tprintf("%s(", undefined_scno_name(tcp)); @@ -2513,6 +2520,13 @@ trace_syscall_exiting(struct tcb *tcp) if (Tflag || cflag) gettimeofday(&tv, NULL); +#ifdef USE_LIBUNWIND + if (stack_trace_enabled) { + if (tcp->s_ent->sys_flags & STACKTRACE_INVALIDATE_CACHE) + unwind_cache_invalidate(tcp); + } +#endif + #if SUPPORTED_PERSONALITIES > 1 update_personality(tcp, tcp->currpers); #endif |