- xbt_dynar_foreach(mc_global_variables, cursor, current_var){
- if(current_var->address < start_data_libsimgrid){ /* binary */
- offset = (char *)current_var->address - (char *)start_data_binary;
- addr_pointed = *((void **)((char *)data2 + offset));
- if(((addr_pointed >= start_plt_binary && addr_pointed <= end_plt_binary)) || ((addr_pointed >= std_heap && (char *)addr_pointed <= (char *)std_heap + STD_HEAP_SIZE )))
- continue;
- res = xbt_malloc0(current_var->size + 1);
- memset(res, 0, current_var->size + 1);
- memcpy(res, (char*)data2 + offset, current_var->size);
- }else{ /* libsimgrid */
- offset = (char *)current_var->address - (char *)start_data_libsimgrid;
- addr_pointed = *((void **)((char *)data1 + offset));
- if((addr_pointed >= start_plt_libsimgrid && addr_pointed <= end_plt_libsimgrid) || (addr_pointed >= std_heap && (char *)addr_pointed <= (char *)std_heap + STD_HEAP_SIZE ))
- continue;
- res = xbt_malloc0(current_var->size + 1);
- memset(res, 0, current_var->size + 1);
- memcpy(res, (char*)data1 + offset, current_var->size);
- }
- if(res != NULL){
- xbt_strbuff_append(clear, (const char*)res);
- xbt_free(res);
- res = NULL;
- }
- }
-
- xbt_sha(clear->data, snapshot_hash);
-
- xbt_strbuff_free(clear);
-
-}
-
-static void get_hash_local(char *snapshot_hash, xbt_dynar_t stacks){
-
- xbt_dynar_t tokens = NULL, s_tokens = NULL;
- unsigned int cursor1 = 0, cursor2 = 0;
- mc_snapshot_stack_t current_stack;
- char *frame_name = NULL;
- void *addr;
-
- xbt_strbuff_t clear = xbt_strbuff_new();
-
- while(cursor1 < xbt_dynar_length(stacks)){
- current_stack = xbt_dynar_get_as(stacks, cursor1, mc_snapshot_stack_t);
- tokens = xbt_str_split(current_stack->local_variables->data, NULL);
- cursor2 = 0;
- while(cursor2 < xbt_dynar_length(tokens)){
- s_tokens = xbt_str_split(xbt_dynar_get_as(tokens, cursor2, char *), "=");
- if(xbt_dynar_length(s_tokens) > 1){
- if(strcmp(xbt_dynar_get_as(s_tokens, 0, char *), "frame_name") == 0){
- xbt_free(frame_name);
- frame_name = xbt_strdup(xbt_dynar_get_as(s_tokens, 1, char *));
- xbt_strbuff_append(clear, (const char*)xbt_dynar_get_as(tokens, cursor2, char *));
- cursor2++;
- xbt_dynar_free(&s_tokens);
- continue;
- }
- addr = (void *) strtoul(xbt_dynar_get_as(s_tokens, 1, char *), NULL, 16);
- if(addr > std_heap && (char *)addr <= (char *)std_heap + STD_HEAP_SIZE){
- cursor2++;
- xbt_dynar_free(&s_tokens);
- continue;
- }
- if(is_stack_ignore_variable(frame_name, xbt_dynar_get_as(s_tokens, 0, char *))){
- cursor2++;
- xbt_dynar_free(&s_tokens);
- continue;
- }
- xbt_strbuff_append(clear, (const char *)xbt_dynar_get_as(tokens, cursor2, char *));
- }
- xbt_dynar_free(&s_tokens);
- cursor2++;
- }
- xbt_dynar_free(&tokens);
- cursor1++;
+ xbt_dynar_foreach(stacks_areas, cursor, current_stack){
+ mc_snapshot_stack_t st = xbt_new(s_mc_snapshot_stack_t, 1);
+ st->local_variables = MC_get_local_variables_values(current_stack->context);
+ st->stack_pointer = MC_get_stack_pointer(current_stack->context, heap);
+ st->real_address = current_stack->address;
+ xbt_dynar_push(res, &st);
+ (*snapshot)->stack_sizes = xbt_realloc((*snapshot)->stack_sizes, (cursor + 1) * sizeof(size_t));
+ (*snapshot)->stack_sizes[cursor] = current_stack->size - ((char *)st->stack_pointer - (char *)((char *)heap + ((char *)current_stack->address - (char *)std_heap)));