[PATCHv4] print stack trace after each syscall
Masatake YAMATO
yamato at redhat.com
Tue Sep 17 12:12:49 UTC 2013
> In the patch `delete_mmap_cache' is used as a trigger for updating
> proc/maps info cache. It is called as expected when mmap and friends
> are traced. However, if the tracing is disabled with -e option, strae
> misses the chance to updating the info cache.
Could you review this patch for the bug I reported and merge if appreciated.
`REQUIRED_BY_STACKTRACE' is introduced to trigger the `delete_mmap_cache'.
Masatake YAMATO
diff --git a/defs.h b/defs.h
index 7f76008..46188c9 100644
--- a/defs.h
+++ b/defs.h
@@ -557,6 +557,7 @@ extern const struct xlat whence_codes[];
#define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */
#define TRACE_MEMORY 0100 /* Trace memory mapping-related syscalls. */
#define SYSCALL_NEVER_FAILS 0200 /* Syscall is always successful. */
+#define REQUIRED_BY_STACKTRACE 0400 /* Trigger proc/maps cache updating */
typedef enum {
CFLAG_NONE = 0,
diff --git a/linux/x86_64/syscallent.h b/linux/x86_64/syscallent.h
index 8e3a200..a710401 100644
--- a/linux/x86_64/syscallent.h
+++ b/linux/x86_64/syscallent.h
@@ -7,9 +7,9 @@
{ 2, TF, sys_lstat, "lstat" }, /* 6 */
{ 3, TD, sys_poll, "poll" }, /* 7 */
{ 3, TD, sys_lseek, "lseek" }, /* 8 */
- { 6, TD|TM, sys_mmap, "mmap" }, /* 9 */
- { 3, TM, sys_mprotect, "mprotect" }, /* 10 */
- { 2, TM, sys_munmap, "munmap" }, /* 11 */
+ { 6, TD|TM|RT,sys_mmap, "mmap" }, /* 9 */
+ { 3, TM|RT, sys_mprotect, "mprotect" }, /* 10 */
+ { 2, TM|RT, sys_munmap, "munmap" }, /* 11 */
{ 1, TM, sys_brk, "brk" }, /* 12 */
{ 4, TS, sys_rt_sigaction, "rt_sigaction" }, /* 13 */
{ 4, TS, sys_rt_sigprocmask, "rt_sigprocmask"}, /* 14 */
@@ -23,7 +23,7 @@
{ 1, TD, sys_pipe, "pipe" }, /* 22 */
{ 5, TD, sys_select, "select" }, /* 23 */
{ 0, 0, sys_sched_yield, "sched_yield" }, /* 24 */
- { 5, TM, sys_mremap, "mremap" }, /* 25 */
+ { 5, TM|RT, sys_mremap, "mremap" }, /* 25 */
{ 3, TM, sys_msync, "msync" }, /* 26 */
{ 3, TM, sys_mincore, "mincore" }, /* 27 */
{ 3, TM, sys_madvise, "madvise" }, /* 28 */
@@ -57,7 +57,7 @@
{ 5, TP, sys_clone, "clone" }, /* 56 */
{ 0, TP, sys_fork, "fork" }, /* 57 */
{ 0, TP, sys_vfork, "vfork" }, /* 58 */
- { 3, TF|TP, sys_execve, "execve" }, /* 59 */
+ { 3, TF|TP|RT,sys_execve, "execve" }, /* 59 */
{ 1, TP, sys_exit, "_exit" }, /* 60 */
{ 4, TP, sys_wait4, "wait4" }, /* 61 */
{ 2, TS, sys_kill, "kill" }, /* 62 */
diff --git a/mem.c b/mem.c
index ca6caa1..ef273c7 100644
--- a/mem.c
+++ b/mem.c
@@ -175,11 +175,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)
- delete_mmap_cache(tcp);
-#endif
-
/* addr */
if (!u_arg[0])
tprints("NULL, ");
@@ -309,12 +304,6 @@ sys_munmap(struct tcb *tcp)
tprintf("%#lx, %lu",
tcp->u_arg[0], tcp->u_arg[1]);
}
-#ifdef USE_LIBUNWIND
- else {
- if (stack_trace_enabled)
- delete_mmap_cache(tcp);
- }
-#endif
return 0;
}
@@ -326,12 +315,6 @@ sys_mprotect(struct tcb *tcp)
tcp->u_arg[0], tcp->u_arg[1]);
printflags(mmap_prot, tcp->u_arg[2], "PROT_???");
}
-#ifdef USE_LIBUNWIND
- else {
- if (stack_trace_enabled)
- delete_mmap_cache(tcp);
- }
-#endif
return 0;
}
diff --git a/process.c b/process.c
index 22bb5b6..aaea9c5 100644
--- a/process.c
+++ b/process.c
@@ -992,12 +992,6 @@ sys_execve(struct tcb *tcp)
tprints("]");
}
}
-#ifdef USE_LIBUNWIND
- else {
- if (stack_trace_enabled)
- delete_mmap_cache(tcp);
- }
-#endif
return 0;
}
diff --git a/syscall.c b/syscall.c
index b01c023..7ddde88 100644
--- a/syscall.c
+++ b/syscall.c
@@ -97,6 +97,7 @@
#define TM TRACE_MEMORY
#define NF SYSCALL_NEVER_FAILS
#define MA MAX_ARGS
+#define RT REQUIRED_BY_STACKTRACE
const struct_sysent sysent0[] = {
#include "syscallent.h"
@@ -2712,6 +2713,11 @@ trace_syscall_exiting(struct tcb *tcp)
#endif
ret:
+#ifdef USE_LIBUNWIND
+ if (stack_trace_enabled)
+ if (tcp->s_ent->sys_flags & REQUIRED_BY_STACKTRACE)
+ delete_mmap_cache(tcp);
+#endif
tcp->flags &= ~TCB_INSYSCALL;
return 0;
}
More information about the Strace-devel
mailing list