From c5071b3b404fbbfc84172a08fb4086bc5ce97fc9 Mon Sep 17 00:00:00 2001 From: Marion Guthmuller Date: Sat, 16 Mar 2013 18:23:31 +0100 Subject: [PATCH] model-checker : get current backtrace with libunwind (only available with ucontext factory for now ...) --- include/xbt/ex.h | 2 ++ src/xbt/backtrace_linux.c | 31 +++++++++++++++++++++++++++++++ src/xbt/mmalloc/mmalloc.c | 7 +++++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/include/xbt/ex.h b/include/xbt/ex.h index 349444cc83..b64b4d0999 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -481,6 +481,8 @@ XBT_PUBLIC(int) xbt_backtrace_no_malloc(void**bt, int size); XBT_PUBLIC(void) xbt_backtrace_current(xbt_ex_t * e); /** @brief Display a previously captured backtrace */ XBT_PUBLIC(void) xbt_backtrace_display(xbt_ex_t * e); +/** @brief Get current backtrace with libunwind */ +XBT_PUBLIC(int) xbt_libunwind_backtrace(void *bt[XBT_BACKTRACE_SIZE], int size); #ifdef XBT_USE_DEPRECATED diff --git a/src/xbt/backtrace_linux.c b/src/xbt/backtrace_linux.c index d7e6d49292..81c62510b2 100644 --- a/src/xbt/backtrace_linux.c +++ b/src/xbt/backtrace_linux.c @@ -12,6 +12,7 @@ #include "xbt/str.h" #include "xbt/module.h" /* xbt_binary_name */ #include "xbt_modinter.h" /* backtrace initialization headers */ +#include /* end of "useless" inclusions */ extern char **environ; /* the environment, as specified by the opengroup */ @@ -365,3 +366,33 @@ void xbt_ex_setup_backtrace(xbt_ex_t * e) //FIXME: This code could be greatly im free(backtrace_syms); free(cmd); } + +int xbt_libunwind_backtrace(void* bt[XBT_BACKTRACE_SIZE], int size){ + + int i = 0; + for(i=0; i < size; i++) + bt[i] = NULL; + + i=0; + + unw_cursor_t c; + unw_context_t uc; + + unw_getcontext (&uc); + unw_init_local (&c, &uc); + + unw_word_t ip; + + unw_step(&c); + + while(unw_step(&c) >= 0 && i < size){ + + unw_get_reg(&c, UNW_REG_IP, &ip); + bt[i] = (void*)(long)ip; + i++; + + } + + return i; + +} diff --git a/src/xbt/mmalloc/mmalloc.c b/src/xbt/mmalloc/mmalloc.c index f0ddc2d489..42845de359 100644 --- a/src/xbt/mmalloc/mmalloc.c +++ b/src/xbt/mmalloc/mmalloc.c @@ -204,6 +204,7 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) candidate_info->busy_frag.frag_size[candidate_frag] = requested_size; candidate_info->busy_frag.ignore[candidate_frag] = 0; //xbt_backtrace_no_malloc(candidate_info->busy_frag.bt[candidate_frag],XBT_BACKTRACE_SIZE); + //xbt_libunwind_backtrace(candidate_info->busy_frag.bt[candidate_frag],XBT_BACKTRACE_SIZE); /* Update the statistics. */ mdp -> heapstats.chunks_used++; @@ -234,6 +235,7 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) mdp->heapinfo[block].busy_frag.frag_size[0] = requested_size; mdp->heapinfo[block].busy_frag.ignore[0] = 0; //xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_frag.bt[0],XBT_BACKTRACE_SIZE); + //xbt_libunwind_backtrace(mdp->heapinfo[block].busy_frag.bt[0],XBT_BACKTRACE_SIZE); /* update stats */ mdp -> heapstats.chunks_free += (BLOCKSIZE >> log) - 1; @@ -283,6 +285,7 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; //mdp->heapinfo[block].busy_block.bt_size=xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); + //mdp->heapinfo[block].busy_block.bt_size = xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); mdp -> heapstats.chunks_used++; mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; @@ -322,9 +325,9 @@ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size) } mdp->heapinfo[block].busy_block.size = blocks; mdp->heapinfo[block].busy_block.busy_size = requested_size; - //mdp->heapinfo[block].busy_block.bt_size = 0; //mdp->heapinfo[block].busy_block.bt_size = xbt_backtrace_no_malloc(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); - + //mdp->heapinfo[block].busy_block.bt_size = xbt_libunwind_backtrace(mdp->heapinfo[block].busy_block.bt,XBT_BACKTRACE_SIZE); + mdp -> heapstats.chunks_used++; mdp -> heapstats.bytes_used += blocks * BLOCKSIZE; mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE; -- 2.20.1