diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 60c79635..f5ce967e 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1209,14 +1209,24 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac } internal CTRL_ProcessMemorySlice -ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us) +ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us) { CTRL_ProcessMemorySlice result = ctrl_query_cached_data_from_process_vaddr_range(arena, machine_id, process, r1u64(vaddr, vaddr+limit), endt_us); - for(U64 idx = 0; idx < result.data.size; idx += 1) + U64 element_count = result.data.size/element_size; + for(U64 element_idx = 0; element_idx < element_count; element_idx += 1) { - if(result.data.str[idx] == 0) + B32 element_is_zero = 1; + for(U64 element_byte_idx = 0; element_byte_idx < element_size; element_byte_idx += 1) { - result.data.size = idx; + if(result.data.str[element_idx*element_size + element_byte_idx] != 0) + { + element_is_zero = 0; + break; + } + } + if(element_is_zero) + { + result.data.size = element_idx*element_size; break; } } @@ -3561,7 +3571,20 @@ ctrl_mem_stream_thread__entry_point(void *p) else { range_base = push_array_no_zero(range_arena, U8, range_size); - U64 bytes_read = dmn_process_read(process, vaddr_range_clamped, range_base); + U64 bytes_read = 0; + U64 retry_count = 0; + for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; retry_count < 64; retry_count += 1) + { + bytes_read = dmn_process_read(process, vaddr_range_clamped_retry, range_base); + if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) + { + vaddr_range_clamped_retry.max -= (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; + } + else + { + break; + } + } if(bytes_read == 0) { arena_release(range_arena); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index afc9f25d..879b404b 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -646,7 +646,7 @@ internal U128 ctrl_hash_store_key_from_process_vaddr_range(CTRL_MachineID machin //- rjf: process memory cache reading helpers internal CTRL_ProcessMemorySlice ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, U64 endt_us); -internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 endt_us); +internal CTRL_ProcessMemorySlice ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, U64 vaddr, U64 limit, U64 element_size, U64 endt_us); //- rjf: process memory writing internal B32 ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range, void *src); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 943bfac4..9494e6f0 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6877,8 +6877,16 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags if(!has_array && direct_type_is_string && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules) && eval.mode == EVAL_EvalMode_Addr) { U64 string_memory_addr = value_eval.imm_u64; - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, 0); - String8 text = df_eval_escaped_from_raw_string(arena, text_slice.data); + U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval.type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + String8 raw_text = {0}; + switch(element_size) + { + default:{raw_text = text_slice.data;}break; + case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; + case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; + } + String8 text = df_eval_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\"")); @@ -6953,8 +6961,16 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags special_case = 1; DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, 0); - String8 text = df_eval_escaped_from_raw_string(arena, text_slice.data); + U64 element_size = tg_byte_size_from_graph_rdi_key(graph, rdi, eval_type->direct_type_key); + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, element_size, 0); + String8 raw_text = {0}; + switch(element_size) + { + default:{raw_text = text_slice.data;}break; + case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; + case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; + } + String8 text = df_eval_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, text).x; space_taken += 2*f_dim_from_tag_size_string(font, font_size, str8_lit("\"")).x; str8_list_push(arena, &list, str8_lit("\""));