X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5414074587ae221c7c677a3158ccebb617349e1a..3f3d8226150530c1653f25c8c7834aa82b4b2e33:/src/mc/mc_checkpoint.c diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 2ffc60ded7..5f924c403c 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -6,12 +6,14 @@ #define _GNU_SOURCE #include +#include #include "mc_private.h" #include "xbt/module.h" #include "../simix/smx_private.h" #include +#include #include "mc_private.h" @@ -21,7 +23,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkpoint, mc, char *libsimgrid_path; static void MC_find_object_address(memory_map_t maps, mc_object_info_t result); -static void MC_get_plt_section(mc_object_info_t info); /************************************ Free functions **************************************/ /*****************************************************************************************/ @@ -238,25 +239,23 @@ void MC_init_memory_map_info(){ } +static void MC_post_process_types(mc_object_info_t info) { + // Nothing here +} + /** \brief Finds informations about a given shared object/executable */ 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; - result->start_plt = NULL; - result->end_plt = NULL; - result->start_got_plt = NULL; - result->end_got_plt = NULL; MC_find_object_address(maps, result); - MC_get_plt_section(result); - result->location_list = MC_dwarf_get_location_list(result->file_name); MC_dwarf_get_variables(result); + MC_post_process_types(result); return result; } /** \brief Fills the position of the .bss and .data sections. */ static void MC_find_object_address(memory_map_t maps, mc_object_info_t result) { + unsigned int i = 0; s_map_region_t reg; const char* name = basename(result->file_name); @@ -266,84 +265,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); - - MC_get_plt_section(result); -} - -/** \brief Fills the position of the .plt and .got.plt sections. */ -static void MC_get_plt_section(mc_object_info_t info){ - - FILE *fp; - 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 xbt_getline */ - - char *lfields[7]; - int i, plt_found = 0; - unsigned long int size, offset; - - char *command = bprintf("LANG=C objdump --section-headers %s", info->file_name); - - fp = popen(command, "r"); - - if(fp == NULL){ - perror("popen failed"); - xbt_abort(); - } - - while ((read = xbt_getline(&line, &n, fp)) != -1 && plt_found != 2) { - - if(n == 0) - continue; - - /* Wipeout the new line character */ - line[read - 1] = '\0'; - - lfields[0] = strtok(line, " "); - - if(lfields[0] == NULL) - continue; - - if(strcmp(lfields[0], "Sections:") == 0 || strcmp(lfields[0], "Idx") == 0 || strncmp(lfields[0], info->file_name, strlen(info->file_name)) == 0) - continue; - - for (i = 1; i < 7 && lfields[i - 1] != NULL; i++) { - lfields[i] = strtok(NULL, " "); - } - - if(i>=6){ - if(strcmp(lfields[1], ".plt") == 0){ - size = strtoul(lfields[2], NULL, 16); - offset = strtoul(lfields[5], NULL, 16); - info->start_plt = (char *) info->start_text + offset; - info->end_plt = (char *) info->start_plt + size; - plt_found++; - }else if(strcmp(lfields[1], ".got.plt") == 0){ - size = strtoul(lfields[2], NULL, 16); - offset = strtoul(lfields[5], NULL, 16); - info->start_got_plt = (char *) info->start_text + offset; - info->end_got_plt = (char *) info->start_plt + size; - plt_found++; - } - - } - - } - - xbt_free(command); - xbt_free(line); - pclose(fp); - + xbt_assert(result->start_rw); + xbt_assert(result->start_exec); } /************************************* Take Snapshot ************************************/ @@ -458,7 +404,7 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){ xbt_abort(); } - unw_word_t ip, sp, off; + unw_word_t ip, off; dw_frame_t frame; unsigned int cursor = 0; @@ -474,14 +420,13 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){ while(ret >= 0 && !stop){ 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); 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); @@ -517,7 +462,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; @@ -529,8 +474,11 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){ new_var->type = strdup(current_variable->type_origin); new_var->region= region_type; - if(current_variable->address.location != NULL){ - new_var->address = (void*) MC_dwarf_resolve_location(&c, current_variable->address.location, frame_pointer_address); + /* if(current_variable->address!=NULL) { + new_var->address = current_variable->address; + } else */ + if(current_variable->location != NULL){ + new_var->address = (void*) MC_dwarf_resolve_location(&c, current_variable->location, frame_pointer_address); } xbt_dynar_push(variables, &new_var);