> 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;
 }

------------------------------------------------------------------------------
LIMITED TIME SALE - Full Year of Microsoft Training For Just $49.99!
1,500+ hours of tutorials including VisualStudio 2012, Windows 8, SharePoint
2013, SQL 2012, MVC 4, more. BEST VALUE: New Multi-Library Power Pack includes
Mobile, Cloud, Java, and UX Design. Lowest price ever! Ends 9/20/13. 
http://pubads.g.doubleclick.net/gampad/clk?id=58041151&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to