Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : get current backtrace with libunwind (only available with ucontext...
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Sat, 16 Mar 2013 17:23:31 +0000 (18:23 +0100)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Sat, 16 Mar 2013 17:30:55 +0000 (18:30 +0100)
include/xbt/ex.h
src/xbt/backtrace_linux.c
src/xbt/mmalloc/mmalloc.c

index 349444c..b64b4d0 100644 (file)
@@ -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);
 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
 
 
 #ifdef XBT_USE_DEPRECATED
 
index d7e6d49..81c6251 100644 (file)
@@ -12,6 +12,7 @@
 #include "xbt/str.h"
 #include "xbt/module.h"         /* xbt_binary_name */
 #include "xbt_modinter.h"       /* backtrace initialization headers */
 #include "xbt/str.h"
 #include "xbt/module.h"         /* xbt_binary_name */
 #include "xbt_modinter.h"       /* backtrace initialization headers */
+#include <libunwind.h>
 /* end of "useless" inclusions */
 
 extern char **environ;          /* the environment, as specified by the opengroup */
 /* 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);
 }
   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;
+  
+}
index f0ddc2d..42845de 100644 (file)
@@ -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);
       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++;
 
       /* 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);
       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;
       
       /* 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.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;
 
         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.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_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;
     mdp -> heapstats.chunks_used++;
     mdp -> heapstats.bytes_used += blocks * BLOCKSIZE;
     mdp -> heapstats.bytes_free -= blocks * BLOCKSIZE;