]> granicus.if.org Git - strace/commitdiff
unwind: enable dwarf cache of libunwind
authorMasatake YAMATO <yamato@redhat.com>
Wed, 16 Apr 2014 06:33:10 +0000 (15:33 +0900)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 30 May 2014 22:57:39 +0000 (22:57 +0000)
Here is the benchmark of the dwarf cache.

Target program:

    #include <sched.h>
    int main(void)
    {
      unsigned int max = 0x6fff, i;
      for (i = 0; i < max; i++)
sched_yield();
      return 0;
    }

Command line:

./strace -o /dev/null -k a.out

With the dwarf cache:

    real 0m12.081s
    user 0m3.858s
    sys  0m8.194s

Without the dwarf cache:

    real 0m22.326s
    user 0m5.218s
    sys 0m16.952s

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
unwind.c

index 53191be45d00814897fffcb0d56c94a13225734d..797a287a81935d13bec05b91458db7991ef94464 100644 (file)
--- a/unwind.c
+++ b/unwind.c
@@ -88,6 +88,7 @@ unwind_init(void)
        libunwind_as = unw_create_addr_space(&_UPT_accessors, 0);
        if (!libunwind_as)
                error_msg_and_die("failed to create address space for stack tracing");
+       unw_set_caching_policy(libunwind_as, UNW_CACHE_GLOBAL);
 }
 
 void
@@ -139,6 +140,8 @@ build_mmap_cache(struct tcb* tcp)
        size_t blen;
        size_t dlen;
 
+       unw_flush_cache (libunwind_as, 0, 0);
+
        sprintf(filename, "/proc/%d/maps", tcp->pid);
        fp = fopen(filename, "r");
        if (!fp) {