From 98dfedfff5d1080f72808c3b502466f4bbeebe44 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 18 Oct 2024 15:16:34 -0700 Subject: [PATCH] limit the amount of line info visualization voff gathering; otherwise we can just spend tons of time gathering inline site voffs forever... --- src/dbg_engine/dbg_engine_core.c | 12 +++++-- src/raddbg/raddbg_core.c | 59 +++++++++++++++++--------------- src/raddbg/raddbg_views.c | 8 ++++- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index b4cec61c..74d8126c 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -951,6 +951,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 array.v = push_array(arena, D_LineList, array.count); } Temp scratch = scratch_begin(&arena, 1); + U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); DI_Scope *scope = di_scope_open(); DI_KeyList dbgi_keys = d_push_active_dbgi_key_list(scratch.arena); String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); @@ -971,7 +972,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 // rjf: file_path_normalized * rdi -> src_id B32 good_src_id = 0; U32 src_id = 0; - if(rdi != &di_rdi_parsed_nil) + if(rdi != &di_rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") { RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); RDI_ParsedNameMap map = {0}; @@ -990,7 +991,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 } // rjf: good src-id -> look up line info for visible range - if(good_src_id) + if(good_src_id) ProfScope("good src-id -> look up line info for visible range") { RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); @@ -1004,7 +1005,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 D_LineList *list = &array.v[line_idx]; U32 voff_count = 0; U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - for(U64 idx = 0; idx < voff_count; idx += 1) + if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); @@ -1024,6 +1025,11 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 n->v.dbgi_key = key; SLLQueuePush(list->first, list->last, n); list->count += 1; + lines_num_voffs[line_idx] += 1; + if(lines_num_voffs[line_idx] >= 8) + { + break; + } } } } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 58ab9649..2beaee40 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -14141,39 +14141,42 @@ rd_frame(void) RD_View *src_view = rd_view_from_handle(rd_regs()->view); RD_ViewRuleKind src_view_kind = rd_view_rule_kind_from_string(src_view->spec->string); RD_Entity *recent_file = rd_entity_from_handle(rd_regs()->entity); - String8 recent_file_path = recent_file->string; - RD_Panel *existing_panel = &rd_nil_panel; - RD_View *existing_view = &rd_nil_view; - for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + if(!rd_entity_is_nil(recent_file)) { - if(!rd_panel_is_nil(panel->first)) + String8 recent_file_path = recent_file->string; + RD_Panel *existing_panel = &rd_nil_panel; + RD_View *existing_view = &rd_nil_view; + for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) { - continue; - } - for(RD_View *v = panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) - { - if(rd_view_is_project_filtered(v)) { continue; } - String8 v_path = rd_file_path_from_eval_string(scratch.arena, str8(v->query_buffer, v->query_string_size)); - RD_ViewRuleKind v_kind = rd_view_rule_kind_from_string(v->spec->string); - if(str8_match(v_path, recent_file_path, StringMatchFlag_CaseInsensitive) && v_kind == src_view_kind) + if(!rd_panel_is_nil(panel->first)) { - existing_panel = panel; - existing_view = v; - goto done_existing_view_search__switch; + continue; + } + for(RD_View *v = panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + { + if(rd_view_is_project_filtered(v)) { continue; } + String8 v_path = rd_file_path_from_eval_string(scratch.arena, str8(v->query_buffer, v->query_string_size)); + RD_ViewRuleKind v_kind = rd_view_rule_kind_from_string(v->spec->string); + if(str8_match(v_path, recent_file_path, StringMatchFlag_CaseInsensitive) && v_kind == src_view_kind) + { + existing_panel = panel; + existing_view = v; + goto done_existing_view_search__switch; + } } } - } - done_existing_view_search__switch:; - if(rd_view_is_nil(existing_view)) - { - rd_cmd(RD_CmdKind_OpenTab, - .string = rd_eval_string_from_file_path(scratch.arena, recent_file_path), - .params_tree = md_tree_from_string(scratch.arena, rd_view_rule_kind_info_table[RD_ViewRuleKind_PendingFile].string)->first); - } - else - { - rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(existing_panel)); - existing_panel->selected_tab_view = rd_handle_from_view(existing_view); + done_existing_view_search__switch:; + if(rd_view_is_nil(existing_view)) + { + rd_cmd(RD_CmdKind_OpenTab, + .string = rd_eval_string_from_file_path(scratch.arena, recent_file_path), + .params_tree = md_tree_from_string(scratch.arena, rd_view_rule_kind_info_table[RD_ViewRuleKind_PendingFile].string)->first); + } + else + { + rd_cmd(RD_CmdKind_FocusPanel, .panel = rd_handle_from_panel(existing_panel)); + existing_panel->selected_tab_view = rd_handle_from_view(existing_view); + } } }break; case RD_CmdKind_SwitchToPartnerFile: diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index ce51ae1b..b2681cb6 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1027,11 +1027,13 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa { default:{}break; case RD_WatchViewColumnKind_Expr: + ProfScope("expr cell string") { result = ev_expr_string_from_row(arena, row, string_flags); }break; case RD_WatchViewColumnKind_Value: case RD_WatchViewColumnKind_Member: + ProfScope("value/member cell string") { EV_ViewRuleList *view_rules = row->view_rules; if(col->view_rule_size != 0) @@ -1043,6 +1045,7 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa result = rd_value_string_from_eval(arena, string_flags, default_radix, font, font_size, max_size_px, eval, row->member, view_rules); }break; case RD_WatchViewColumnKind_Type: + ProfScope("type cell string") { E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, row_col_expr); E_TypeKey type_key = irtree.type_key; @@ -1050,10 +1053,12 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa result = str8_skip_chop_whitespace(result); }break; case RD_WatchViewColumnKind_ViewRule: + ProfScope("view rule cell string") { result = ev_view_rule_from_key(ev, row->key); }break; case RD_WatchViewColumnKind_Module: + ProfScope("module cell string") { E_Eval eval = e_eval_from_expr(arena, row_col_expr); E_Eval value_eval = e_value_eval_from_eval(eval); @@ -1063,6 +1068,7 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa result = push_str8_copy(arena, str8_skip_last_slash(module->string)); }break; case RD_WatchViewColumnKind_CallStackFrame: + ProfScope("call stack frame cell string") { Temp scratch = scratch_begin(&arena, 1); DI_Scope *di_scope = di_scope_open(); @@ -2232,7 +2238,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo if(row_eval.mode == E_Mode_Value) { CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity); - row_module = ctrl_module_from_process_vaddr(process, row_eval.value.u64); + row_module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity)); }break; } }