X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/72f3e5bb7597e85d02f6fb4dea3c7a8ac18d520a..d22dbf808ef73d20175495533fe33a47fd2252cb:/src/mc/mc_checkpoint.c diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index d23fbf5911..64d8c715a5 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -48,7 +48,7 @@ static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size) new_reg->data = xbt_malloc0(size); memcpy(new_reg->data, start_addr, size); - XBT_DEBUG("New region : type : %d, data : %p, size : %zu", type, new_reg->data, size); + XBT_DEBUG("New region : type : %d, data : %p (real addr %p), size : %zu", type, new_reg->data, start_addr, size); return new_reg; } @@ -91,11 +91,7 @@ void MC_init_memory_map_info(){ while (i < maps->mapsize) { reg = maps->regions[i]; if ((reg.prot & PROT_WRITE)){ - if (maps->regions[i].pathname == NULL){ - if(reg.start_addr == raw_heap){ - end_raw_heap = reg.end_addr; - } - } else { + if (maps->regions[i].pathname != NULL){ if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ start_data_libsimgrid = reg.start_addr; i++; @@ -110,6 +106,9 @@ void MC_init_memory_map_info(){ start_bss_binary = reg.start_addr; i++; } + }else if(!memcmp(maps->regions[i].pathname, "[heap]", 6)){ + end_raw_heap = reg.end_addr; + i++; } } }else if ((reg.prot & PROT_READ) && (reg.prot & PROT_EXEC)){ @@ -117,10 +116,8 @@ void MC_init_memory_map_info(){ if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ start_text_libsimgrid = reg.start_addr; libsimgrid_path = strdup(maps->regions[i].pathname); - }else{ - if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ - start_text_binary = reg.start_addr; - } + }else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ + start_text_binary = reg.start_addr; } } } @@ -154,6 +151,8 @@ mc_snapshot_t MC_take_snapshot() memory_map_t maps = get_memory_map(); int nb_reg = 0; void *heap = NULL; + size_t size = 0; + void *start = NULL; /* Save the std heap and the writable mapped pages of libsimgrid */ while (i < maps->mapsize) { @@ -164,57 +163,46 @@ mc_snapshot_t MC_take_snapshot() MC_snapshot_add_region(snapshot, 0, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); heap = snapshot->regions[nb_reg]->data; nb_reg++; - }else if(reg.start_addr == raw_heap){ - end_raw_heap = reg.end_addr; } i++; - } else { + } else{ if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ - MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); - start_data_libsimgrid = reg.start_addr; + size = (char*)reg.end_addr - (char*)reg.start_addr; + start = reg.start_addr; nb_reg++; i++; reg = maps->regions[i]; if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){ - MC_snapshot_add_region(snapshot, 1, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); + size += (char*)reg.end_addr - (char*)reg.start_addr; reg = maps->regions[i]; i++; - nb_reg++; } - } else { - if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ - MC_snapshot_add_region(snapshot, 2, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); - nb_reg++; - i++; + MC_snapshot_add_region(snapshot, 1, start, size); + }else if(!memcmp(maps->regions[i].pathname, "[heap]", 6)){ + end_raw_heap = reg.end_addr; + i++; + } else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ + size = (char*)reg.end_addr - (char*)reg.start_addr; + start = reg.start_addr; + nb_reg++; + i++; + reg = maps->regions[i]; + if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && reg.start_addr != std_heap && reg.start_addr != raw_heap && i < maps->mapsize){ + size += (char*)reg.end_addr - (char*)reg.start_addr; reg = maps->regions[i]; - if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && reg.start_addr != std_heap && reg.start_addr != raw_heap && i < maps->mapsize){ - MC_snapshot_add_region(snapshot, 2, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); - reg = maps->regions[i]; - nb_reg++; - } - }else{ i++; } - } - } - }else if ((reg.prot & PROT_READ)){ - if (maps->regions[i].pathname != NULL){ - if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ - start_text_libsimgrid = reg.start_addr; - libsimgrid_path = strdup(maps->regions[i].pathname); + MC_snapshot_add_region(snapshot, 2, start, size); }else{ - if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ - start_text_binary = reg.start_addr; - } + i++; } } - i++; }else{ i++; } } - if(_surf_mc_visited > 0 || strcmp(_surf_mc_property_file,"")) + if(_sg_mc_visited > 0 || strcmp(_sg_mc_property_file,"")) snapshot->stacks = take_snapshot_stacks(heap); free_memory_map(maps); @@ -259,9 +247,6 @@ void get_libsimgrid_plt_section(){ int i, plt_found = 0; unsigned long int size, offset; - if(libsimgrid_path == NULL) - libsimgrid_path = get_libsimgrid_path(); - char *command = bprintf("objdump --section-headers %s", libsimgrid_path); fp = popen(command, "r"); @@ -461,16 +446,14 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) unw_get_reg(&c, UNW_REG_IP, &ip); unw_get_reg(&c, UNW_REG_SP, &sp); - unw_get_proc_name (&c, frame_name, sizeof (frame_name), &off); - - xbt_strbuff_append(variables, bprintf("ip=%s\n", frame_name)); + unw_get_proc_name(&c, frame_name, sizeof (frame_name), &off); frame = xbt_dict_get_or_null(mc_local_variables, frame_name); - if(frame == NULL){ - ret = unw_step(&c); - continue; - } + if(frame == NULL) + return variables; + + xbt_strbuff_append(variables, bprintf("ip=%s\n", frame_name)); true_ip = (long)frame->low_pc + (long)off;