mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-03 12:38:11 +00:00
extend ctrl process memory cache reads with freshness info - it is a bit too coarse grained at page granularity, that should've been easy to predict... in any case, to start addressing that, start keeping >1 hash key hash history in hash store layer, such that history may be preserved for a bit longer & diff'd with new key hashes
This commit is contained in:
+14
-8
@@ -3486,12 +3486,14 @@ df_tls_base_vaddr_from_thread(DF_Entity *thread)
|
||||
U64 thread_info_addr = ctrl_tls_root_vaddr_from_thread(thread->ctrl_machine_id, thread->ctrl_handle);
|
||||
U64 tls_addr_off = tls_index*addr_size;
|
||||
U64 tls_addr_array = 0;
|
||||
String8 tls_addr_array_data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size));
|
||||
CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size));
|
||||
String8 tls_addr_array_data = tls_addr_array_slice.data;
|
||||
if(tls_addr_array_data.size >= 8)
|
||||
{
|
||||
MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64));
|
||||
}
|
||||
String8 result_data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size));
|
||||
CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size));
|
||||
String8 result_data = result_slice.data;
|
||||
if(result_data.size >= 8)
|
||||
{
|
||||
MemoryCopy(&base_vaddr, result_data.str, sizeof(U64));
|
||||
@@ -3953,7 +3955,8 @@ df_eval_memory_read(void *u, void *out, U64 addr, U64 size)
|
||||
Assert(process->kind == DF_EntityKind_Process);
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
B32 result = 0;
|
||||
String8 data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size));
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(addr, addr+size));
|
||||
String8 data = slice.data;
|
||||
if(data.size == size)
|
||||
{
|
||||
result = 1;
|
||||
@@ -4251,7 +4254,8 @@ df_value_mode_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_CtrlCtx *c
|
||||
Rng1U64 vaddr_range = r1u64(eval.offset, eval.offset + type_byte_size);
|
||||
if(dim_1u64(vaddr_range) == type_byte_size)
|
||||
{
|
||||
String8 data = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, vaddr_range);
|
||||
String8 data = slice.data;
|
||||
MemoryZeroArray(eval.imm_u128);
|
||||
MemoryCopy(eval.imm_u128, data.str, Min(data.size, sizeof(U64)*2));
|
||||
eval.mode = EVAL_EvalMode_Value;
|
||||
@@ -4328,14 +4332,16 @@ df_dynamically_typed_eval_from_eval(TG_Graph *graph, RADDBG_Parsed *rdbg, DF_Ctr
|
||||
{
|
||||
U64 ptr_vaddr = eval.offset;
|
||||
U64 addr_size = bit_size_from_arch(arch)/8;
|
||||
String8 ptr_value_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(ptr_vaddr, ptr_vaddr+addr_size));
|
||||
CTRL_ProcessMemorySlice ptr_value_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(ptr_vaddr, ptr_vaddr+addr_size));
|
||||
String8 ptr_value_memory = ptr_value_slice.data;
|
||||
if(ptr_value_memory.size >= addr_size)
|
||||
{
|
||||
U64 class_base_vaddr = 0;
|
||||
MemoryCopy(&class_base_vaddr, ptr_value_memory.str, addr_size);
|
||||
String8 vtable_base_ptr_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(class_base_vaddr, class_base_vaddr+addr_size));
|
||||
CTRL_ProcessMemorySlice vtable_base_ptr_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle,
|
||||
r1u64(class_base_vaddr, class_base_vaddr+addr_size));
|
||||
String8 vtable_base_ptr_memory = vtable_base_ptr_slice.data;
|
||||
if(vtable_base_ptr_memory.size >= addr_size)
|
||||
{
|
||||
U64 vtable_vaddr = 0;
|
||||
|
||||
+12
-7
@@ -6786,7 +6786,8 @@ 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;
|
||||
String8 text = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, string_memory_addr, 256, max_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, max_U64);
|
||||
String8 text = text_slice.data;
|
||||
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("\""));
|
||||
@@ -6858,7 +6859,8 @@ 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);
|
||||
String8 text = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.offset, 256, max_U64);
|
||||
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, max_U64);
|
||||
String8 text = text_slice.data;
|
||||
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("\""));
|
||||
@@ -9009,6 +9011,9 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
DF_Entity *selected_thread = df_entity_from_handle(ctrl_ctx->thread);
|
||||
DF_Entity *selected_thread_process = df_entity_ancestor_from_kind(selected_thread, DF_EntityKind_Process);
|
||||
U64 selected_thread_rip_unwind_vaddr = df_query_cached_rip_from_thread_unwind(selected_thread, ctrl_ctx->unwind_count);
|
||||
DF_Entity *selected_thread_module = df_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr);
|
||||
CTRL_Event stop_event = df_ctrl_last_stop_event();
|
||||
DF_Entity *stopper_thread = df_entity_from_ctrl_handle(stop_event.machine_id, stop_event.entity);
|
||||
B32 is_focused = ui_is_focus_active();
|
||||
@@ -9847,7 +9852,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
{
|
||||
has_line_info = (src2dasm_list->first->v.remap_line == line_num);
|
||||
line_info_line_num = line_num;
|
||||
line_info_t = src2dasm_list->first->v.binary->alive_t;
|
||||
line_info_t = selected_thread_module->alive_t;
|
||||
}
|
||||
if(dasm2src_list->first != 0)
|
||||
{
|
||||
@@ -9866,7 +9871,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
DF_Entity *binary = dasm2src_info->binary;
|
||||
has_line_info = 1;
|
||||
line_info_line_num = dasm2src_info->pt.line;
|
||||
line_info_t = binary->alive_t;
|
||||
line_info_t = selected_thread_module->alive_t;
|
||||
}
|
||||
}
|
||||
if(has_line_info)
|
||||
@@ -9969,7 +9974,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = DF_ThemeColor_CodeFunction;
|
||||
mix_t = binary->alive_t;
|
||||
mix_t = selected_thread_module->alive_t;
|
||||
}
|
||||
}
|
||||
if(!mapped_special)
|
||||
@@ -9979,7 +9984,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = DF_ThemeColor_CodeType;
|
||||
mix_t = binary->alive_t;
|
||||
mix_t = selected_thread_module->alive_t;
|
||||
}
|
||||
}
|
||||
if(!mapped_special)
|
||||
@@ -9989,7 +9994,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = DF_ThemeColor_CodeLocal;
|
||||
mix_t = binary->alive_t;
|
||||
mix_t = selected_thread_module->alive_t;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -30,7 +30,8 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed
|
||||
U64 array_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
U64 array_total_size_capped = ClampTop(array_total_size, 64);
|
||||
Rng1U64 array_memory_vaddr_rng = r1u64(eval.offset, eval.offset + array_total_size_capped);
|
||||
String8 array_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng);
|
||||
CTRL_ProcessMemorySlice array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, array_memory_vaddr_rng);
|
||||
String8 array_memory = array_slice.data;
|
||||
TG_Key element_type_key = tg_unwrapped_direct_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
TG_Kind element_type_kind = tg_kind_from_key(element_type_key);
|
||||
U64 element_type_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, element_type_key);
|
||||
@@ -66,7 +67,8 @@ df_view_rule_hooks__rgba_from_eval(DF_Eval eval, TG_Graph *graph, RADDBG_Parsed
|
||||
U64 struct_total_size = tg_byte_size_from_graph_raddbg_key(graph, raddbg, type_key);
|
||||
U64 struct_total_size_capped = ClampTop(struct_total_size, 64);
|
||||
Rng1U64 struct_memory_vaddr_rng = r1u64(eval.offset, eval.offset + struct_total_size_capped);
|
||||
String8 struct_memory = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng);
|
||||
CTRL_ProcessMemorySlice struct_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, struct_memory_vaddr_rng);
|
||||
String8 struct_memory = struct_slice.data;
|
||||
TG_Type *type = tg_type_from_graph_raddbg_key(scratch.arena, graph, raddbg, type_key);
|
||||
for(U64 element_idx = 0, member_idx = 0;
|
||||
element_idx < 4 && member_idx < type->count;
|
||||
|
||||
+17
-1
@@ -1032,7 +1032,23 @@ df_eval_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_EvalW
|
||||
//- rjf: build normal row
|
||||
if(!(row->flags & DF_EvalVizRowFlag_Canvas))
|
||||
{
|
||||
ui_set_next_flags(disabled_flags);
|
||||
B32 row_is_fresh = 0;
|
||||
if(row->eval.mode == EVAL_EvalMode_Addr)
|
||||
{
|
||||
Temp temp = temp_begin(scratch.arena);
|
||||
U64 vaddr = row->eval.offset;
|
||||
U64 size = tg_byte_size_from_graph_raddbg_key(parse_ctx.type_graph, parse_ctx.rdbg, row->eval.type_key);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(vaddr, vaddr+size));
|
||||
row_is_fresh = slice.fresh;
|
||||
temp_end(temp);
|
||||
}
|
||||
ui_set_next_flags(disabled_flags|(UI_BoxFlag_DrawBackground*row_is_fresh));
|
||||
if(row_is_fresh)
|
||||
{
|
||||
Vec4F32 fresh_bg_color = df_rgba_from_theme_color(DF_ThemeColor_Highlight0);
|
||||
fresh_bg_color.w *= 0.25f;
|
||||
ui_set_next_background_color(fresh_bg_color);
|
||||
}
|
||||
UI_NamedTableVectorF("row_%I64x", row_hash)
|
||||
{
|
||||
//- rjf: expression
|
||||
|
||||
Reference in New Issue
Block a user