summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasatake YAMATO <yamato@redhat.com>2014-04-16 15:33:35 +0900
committerDmitry V. Levin <ldv@altlinux.org>2014-05-30 22:59:01 +0000
commited69fc2dc3da87d337ddd02f9153a82a46196cdf (patch)
tree580ef9ddeeea6c7352c4a820a8850452eebcb592
parent549e2c4a9858a380b03eb6e2ff4861d2c6687d6a (diff)
downloadstrace-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.c27
-rw-r--r--process.c13
-rw-r--r--syscall.c14
3 files changed, 14 insertions, 40 deletions
diff --git a/mem.c b/mem.c
index 180e37006..6ecd363c8 100644
--- a/mem.c
+++ b/mem.c
@@ -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;
}
diff --git a/process.c b/process.c
index ec9e1b4ed..a880f9e36 100644
--- a/process.c
+++ b/process.c
@@ -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;
}
diff --git a/syscall.c b/syscall.c
index f81655102..c95eb6c88 100644
--- a/syscall.c
+++ b/syscall.c
@@ -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