X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8eece7b129709e79f87d945138a01ba44179c42b..f3c8c23cc7784052a0cce9a77975d4dcfe4ba903:/src/mc/mc_liveness.c diff --git a/src/mc/mc_liveness.c b/src/mc/mc_liveness.c index 221b87992c..8255beacaa 100644 --- a/src/mc/mc_liveness.c +++ b/src/mc/mc_liveness.c @@ -33,6 +33,59 @@ unsigned int hash_region(char *str, int str_len){ } +const char* get_memory_map_addr(void *addr){ + + FILE *fp; /* File pointer to process's proc maps file */ + char *line = NULL; /* Temporal storage for each line that is readed */ + ssize_t read; /* Number of bytes readed */ + size_t n = 0; /* Amount of bytes to read by getline */ + + fp = fopen("/proc/self/maps", "r"); + + if(fp == NULL) + perror("fopen failed"); + + if(addr == NULL){ + fclose(fp); + return "nil"; + } + + xbt_dynar_t lfields = NULL; + xbt_dynar_t start_end = NULL; + void *start_addr; + void *end_addr; + + while ((read = getline(&line, &n, fp)) != -1) { + + xbt_str_trim(line, NULL); + xbt_str_strip_spaces(line); + lfields = xbt_str_split(line,NULL); + + start_end = xbt_str_split(xbt_dynar_get_as(lfields, 0, char*), "-"); + start_addr = (void *) strtoul(xbt_dynar_get_as(start_end, 0, char*), NULL, 16); + end_addr = (void *) strtoul(xbt_dynar_get_as(start_end, 1, char*), NULL, 16); + + if((addr > start_addr) && ( addr < end_addr)){ + free(line); + fclose(fp); + if(start_addr == std_heap) + return "std_heap"; + if(start_addr == raw_heap) + return "raw_heap"; + if(xbt_dynar_length(lfields) == 6) + return xbt_dynar_get_as(lfields, xbt_dynar_length(lfields) - 1, char*); + else + return "Anonymous"; + } + + } + + free(line); + fclose(fp); + return "Unknown area"; + +} + int data_program_region_compare(void *d1, void *d2, size_t size){ int distance = 0; int pointer_align; @@ -43,12 +96,11 @@ int data_program_region_compare(void *d1, void *d2, size_t size){ fprintf(stderr,"Different byte (offset=%d) (%p - %p) in data program region\n", i, (char *)d1 + i, (char *)d2 + i); distance++; pointer_align = (i /sizeof(void *)) * sizeof(void *); - fprintf(stderr, "Pointer address : %p - %p\n", (char *)d1 + pointer_align, (char *)d2 + pointer_align); - fprintf(stderr, "Pointed address : %p - %p\n", *((void **)((char *)d1 + pointer_align)), *((void **)((char *)d2 + pointer_align))); + fprintf(stderr, "Pointed address : %p (in %s) - %p (in %s)\n", *((void **)((char *)d1 + pointer_align)), get_memory_map_addr(*((void **)((char *)d1 + pointer_align))), *((void **)((char *)d2 + pointer_align)), get_memory_map_addr(*((void **)((char *)d2 + pointer_align)))); } } - fprintf(stderr, "Hamming distance between data program regions : %d", distance); + fprintf(stderr, "Hamming distance between data program regions : %d\n", distance); return distance; } @@ -60,20 +112,19 @@ int data_libsimgrid_region_compare(void *d1, void *d2, size_t size){ for(i=0; inum_reg != s2->num_reg){ @@ -113,7 +164,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ return 1; } } - if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data)){ + if(mmalloc_compare_heap(s1->regions[i]->data, s2->regions[i]->data, s_heap, r_heap)){ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){ XBT_DEBUG("Different heap (mmalloc_compare)"); errors++; @@ -139,7 +190,7 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ return 1; } } - if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ + if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){ XBT_DEBUG("Different memcmp for data in libsimgrid"); errors++; @@ -165,9 +216,9 @@ int snapshot_compare(mc_snapshot_t s1, mc_snapshot_t s2){ return 1; } } - if(data_libsimgrid_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ + if(data_program_region_compare(s1->regions[i]->data, s2->regions[i]->data, s1->regions[i]->size) != 0){ if(XBT_LOG_ISENABLED(mc_liveness, xbt_log_priority_debug)){ - XBT_DEBUG("Different memcmp for data in libsimgrid"); + XBT_DEBUG("Different memcmp for data in program"); errors++; }else{ return 1; @@ -222,7 +273,7 @@ int reached(xbt_state_t st){ //XBT_DEBUG("Rdv points size %d - %d", xbt_dict_length(pair_test->rdv_points), xbt_dict_length(current_rdv_points)); //if(xbt_dict_length(pair_test->rdv_points) == xbt_dict_length(current_rdv_points)){ //if(rdv_points_compare(pair_test->rdv_points, current_rdv_points) == 0){ - if(snapshot_compare(pair_test->system_state, sn) == 0){ + if(snapshot_compare(pair_test->system_state, sn, std_heap, raw_heap) == 0){ MC_free_snapshot(sn); xbt_dynar_reset(prop_ato); xbt_free(prop_ato); @@ -619,7 +670,7 @@ int visited(xbt_state_t st, int sc){ if(pair_test->search_cycle == sc) { if(automaton_state_compare(pair_test->automaton_state, st) == 0){ if(propositional_symbols_compare_value(pair_test->prop_ato, prop_ato) == 0){ - if(snapshot_compare(pair_test->system_state, sn) == 0){ + if(snapshot_compare(pair_test->system_state, sn, std_heap, raw_heap) == 0){ MC_free_snapshot(sn); xbt_dynar_reset(prop_ato); @@ -876,9 +927,6 @@ void MC_ddfs_init(void){ XBT_DEBUG("Double-DFS init"); XBT_DEBUG("**************************************************"); - XBT_DEBUG("Std heap : %p", std_heap); - XBT_DEBUG("Raw heap : %p", raw_heap); - mc_pair_stateless_t mc_initial_pair = NULL; mc_state_t initial_graph_state = NULL; smx_process_t process;