Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Have a more complete/accurate view of an given object mapping in memory
[simgrid.git] / src / mc / mc_checkpoint.c
index fb323a4..5aeff81 100644 (file)
@@ -243,8 +243,6 @@ void MC_init_memory_map_info(){
 mc_object_info_t MC_find_object_info(memory_map_t maps, char* name) {
   mc_object_info_t result = MC_new_object_info();
   result->file_name = xbt_strdup(name);
-  result->start_data = NULL;
-  result->start_text = NULL;
   MC_find_object_address(maps, result);
   MC_dwarf_get_variables(result);
   return result;
@@ -262,16 +260,31 @@ static void MC_find_object_address(memory_map_t maps, mc_object_info_t result) {
       // Nothing to do
     }
     else if ((reg.prot & PROT_WRITE)){
-          result->start_data = reg.start_addr;
+          xbt_assert(!result->start_rw,
+            "Multiple read-write segments for %s, not supported",
+            maps->regions[i].pathname);
+          result->start_rw = reg.start_addr;
+          result->end_rw   = reg.end_addr;
     } else if ((reg.prot & PROT_READ) && (reg.prot & PROT_EXEC)){
-          result->start_text = reg.start_addr;
+          xbt_assert(!result->start_exec,
+            "Multiple executable segments for %s, not supported",
+            maps->regions[i].pathname);
+          result->start_exec = reg.start_addr;
+          result->end_exec   = reg.end_addr;
+    }
+    else if((reg.prot & PROT_READ) && !(reg.prot & PROT_EXEC)) {
+        xbt_assert(!result->start_ro,
+          "Multiple read only segments for %s, not supported",
+          maps->regions[i].pathname);
+        result->start_ro = reg.start_addr;
+        result->end_ro   = reg.end_addr;
     }
     i++;
   }
 
   xbt_assert(result->file_name);
-  xbt_assert(result->start_data);
-  xbt_assert(result->start_text);
+  xbt_assert(result->start_rw);
+  xbt_assert(result->start_exec);
 }
 
 /************************************* Take Snapshot ************************************/
@@ -409,7 +422,7 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){
     if(!strcmp(frame_name, "smx_ctx_sysv_wrapper")) /* Stop before context switch with maestro */
       stop = 1;
 
-    if((long)ip > (long) mc_libsimgrid_info->start_text)
+    if((long)ip > (long) mc_libsimgrid_info->start_exec)
       frame = xbt_dict_get_or_null(mc_libsimgrid_info->local_variables, frame_name);
     else
       frame = xbt_dict_get_or_null(mc_binary_info->local_variables, frame_name);
@@ -445,7 +458,7 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){
 
     xbt_dynar_foreach(frame->variables, cursor, current_variable){
       
-      if((long)ip > (long)mc_libsimgrid_info->start_text)
+      if((long)ip > (long)mc_libsimgrid_info->start_exec)
         region_type = 1;
       else
         region_type = 2;