X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ae54134baee4ae2fa16a9c49cdb9daa646a3c569..57fe5b0979405e769623b751871db271dfb61652:/src/mc/mc_checkpoint.c diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 0703b1744c..e9830d5138 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -18,7 +18,8 @@ void *start_text_libsimgrid; void *start_plt_libsimgrid, *end_plt_libsimgrid; void *start_plt_binary, *end_plt_binary; char *libsimgrid_path; -void *start_data_libsimgrid; +void *start_data_libsimgrid, *start_bss_libsimgrid; +void *start_data_binary, *start_bss_binary; void *start_text_binary; void *end_raw_heap; @@ -132,6 +133,18 @@ void MC_init_memory_map_info(){ } else { if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ start_data_libsimgrid = reg.start_addr; + i++; + reg = maps->regions[i]; + if(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize) + start_bss_libsimgrid = reg.start_addr; + }else if (!memcmp(basename(maps->regions[i].pathname), basename(xbt_binary_name), strlen(basename(xbt_binary_name)))){ + start_data_binary = reg.start_addr; + 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){ + start_bss_binary = reg.start_addr; + i++; + } } } }else if ((reg.prot & PROT_READ)){ @@ -193,18 +206,26 @@ mc_snapshot_t MC_take_snapshot_liveness() nb_reg++; i++; reg = maps->regions[i]; - while(reg.pathname == NULL && (reg.prot & PROT_WRITE) && i < maps->mapsize){ + 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); - i++; 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++; + 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++; } - i++; } } }else if ((reg.prot & PROT_READ)){ @@ -551,11 +572,12 @@ static xbt_strbuff_t get_local_variables_values(void *stack_context, void *heap) } if(xbt_dynar_length(compose) > 0){ + //XBT_INFO("Variable : %s", current_variable->name); if(strcmp(xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->type, "value") == 0){ //XBT_INFO("Variable : %s - value : %lx", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res); xbt_strbuff_append(variables, bprintf("%s=%lx\n", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res)); }else{ - if(*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) == NULL){ + if((long)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address < 0 || *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) == NULL){ //XBT_INFO("Variable : %s - address : NULL", current_variable->name); xbt_strbuff_append(variables, bprintf("%s=NULL\n", current_variable->name)); }else if(((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) > 0xffffffff) || ((long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1,variable_value_t)->value.address) < (long)start_text_binary)){ @@ -614,3 +636,9 @@ static void snapshot_stack_free(mc_snapshot_stack_t s){ void snapshot_stack_free_voidp(void *s){ snapshot_stack_free((mc_snapshot_stack_t) * (void **) s); } + +void *MC_snapshot(void){ + + return simcall_mc_snapshot(); + +}