- unw_word_t ip, sp, off;
- dw_frame_t frame;
-
- xbt_dynar_t compose = xbt_dynar_new(sizeof(variable_value_t), variable_value_free_voidp);
-
- xbt_strbuff_t variables = xbt_strbuff_new();
- xbt_dict_cursor_t dict_cursor;
- char *variable_name;
- dw_local_variable_t current_variable;
- unsigned int cursor = 0, cursor2 = 0;
- dw_location_entry_t entry = NULL;
- dw_location_t location_entry = NULL;
- unw_word_t res;
- int frame_found = 0;
- void *frame_pointer_address = NULL;
- long true_ip;
- char *to_append;
-
- while(ret >= 0){
-
- 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);
-
- frame = xbt_dict_get_or_null(mc_local_variables, frame_name);
-
- if(frame == NULL){
- xbt_dynar_free(&compose);
- xbt_dict_cursor_free(&dict_cursor);
- return variables;
- }
-
- to_append = bprintf("frame_name=%s\n", frame_name);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- to_append = bprintf("ip=%lx\n", ip);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
-
- true_ip = (long)frame->low_pc + (long)off;
-
- /* Get frame pointer */
- switch(frame->frame_base->type){
- case e_dw_loclist:
- while((cursor < xbt_dynar_length(frame->frame_base->location.loclist)) && frame_found == 0){
- entry = xbt_dynar_get_as(frame->frame_base->location.loclist, cursor, dw_location_entry_t);
- if((true_ip >= entry->lowpc) && (true_ip < entry->highpc)){
- frame_found = 1;
- switch(entry->location->type){
- case e_dw_compose:
- xbt_dynar_reset(compose);
- cursor2 = 0;
- while(cursor2 < xbt_dynar_length(entry->location->location.compose)){
- location_entry = xbt_dynar_get_as(entry->location->location.compose, cursor2, dw_location_t);
- switch(location_entry->type){
- case e_dw_register:
- unw_get_reg(&c, location_entry->location.reg, &res);
- add_value(&compose, "address", (long)res);
- break;
- case e_dw_bregister_op:
- unw_get_reg(&c, location_entry->location.breg_op.reg, &res);
- add_value(&compose, "address", (long)res + location_entry->location.breg_op.offset);
- break;
- default:
- xbt_dynar_reset(compose);
- break;
- }
- cursor2++;
- }
-
- if(!xbt_dynar_is_empty(compose)){
- frame_pointer_address = xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address ;
- }
- break;
- default :
- frame_pointer_address = NULL;
- break;
- }
- }
- cursor++;
- }
- break;
- default :
- frame_pointer_address = NULL;
- break;
- }
-
- frame_found = 0;
- cursor = 0;
-
- xbt_dict_foreach(frame->variables, dict_cursor, variable_name, current_variable){
- if(current_variable->location != NULL){
- switch(current_variable->location->type){
- case e_dw_compose:
- xbt_dynar_reset(compose);
- cursor = 0;
- while(cursor < xbt_dynar_length(current_variable->location->location.compose)){
- location_entry = xbt_dynar_get_as(current_variable->location->location.compose, cursor, dw_location_t);
- switch(location_entry->type){
- case e_dw_register:
- unw_get_reg(&c, location_entry->location.reg, &res);
- add_value(&compose, "value", (long)res);
- break;
- case e_dw_bregister_op:
- unw_get_reg(&c, location_entry->location.breg_op.reg, &res);
- add_value(&compose, "address", (long)res + location_entry->location.breg_op.offset);
- break;
- case e_dw_fbregister_op:
- if(frame_pointer_address != NULL)
- add_value(&compose, "address", (long)((char *)frame_pointer_address + location_entry->location.fbreg_op));
- break;
- default:
- xbt_dynar_reset(compose);
- break;
- }
- cursor++;
- }
-
- if(!xbt_dynar_is_empty(compose)){
- if(strcmp(xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->type, "value") == 0){
- to_append = bprintf("%s=%lx\n", current_variable->name, xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.res);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }else{
- 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){
- to_append = bprintf("%s=NULL\n", current_variable->name);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }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)){
- to_append = bprintf("%s=%u\n", current_variable->name, (unsigned int)(long)*((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address));
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }else{
- to_append = bprintf("%s=%p\n", current_variable->name, *((void**)xbt_dynar_get_as(compose, xbt_dynar_length(compose) - 1, variable_value_t)->value.address));
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }
- }
- }else{
- to_append = bprintf("%s=undefined\n", current_variable->name);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }
- break;
- default :
- break;
- }
- }else{
- to_append = bprintf("%s=undefined\n", current_variable->name);
- xbt_strbuff_append(variables, to_append);
- xbt_free(to_append);
- }
- }
-
- ret = unw_step(&c);
-