From 04815b426561f7d6ac22017007d1802f715952b0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 1 Oct 2024 09:36:29 -0700 Subject: [PATCH] continue work on ctrl entity visualization in watch views & further progress on new scheduler --- src/ctrl/ctrl_core.h | 3 +- src/raddbg/raddbg_core.c | 27 +++++- src/raddbg/raddbg_core.h | 2 +- src/raddbg/raddbg_views.c | 168 ++++++++++++++++++++------------------ src/raddbg/raddbg_views.h | 1 + 5 files changed, 116 insertions(+), 85 deletions(-) diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 99b320dc..40eed5ce 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -143,7 +143,8 @@ struct_members(CTRL_ProcessMetaEval) struct_members(CTRL_ModuleMetaEval) { member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")), - member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Executable")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")), + member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),exe, .pretty_name = str8_lit_comp("Executable Path")), member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),dbg, .pretty_name = str8_lit_comp("Debug Info Path")), member_lit_comp(CTRL_MetaEval, type(Rng1U64), vaddr_range, .pretty_name = str8_lit_comp("Address Range")), }; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3c244ede..d49e7dd9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1857,7 +1857,7 @@ rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) } internal DR_FancyStringList -rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size) +rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras) { DR_FancyStringList result = {0}; RD_IconKind icon_kind = RD_IconKind_Null; @@ -1874,9 +1874,24 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]); } dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); + if(entity->kind == CTRL_EntityKind_Thread) + { + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(processes.count > 1) + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + String8 process_name = rd_name_from_ctrl_entity(arena, process); + Vec4F32 process_color = rd_rgba_from_ctrl_entity(process); + if(process_name.size != 0) + { + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, process_color, process_name); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" / ")); + } + } + } String8 name = rd_name_from_ctrl_entity(arena, entity); dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color, name); - if(entity->kind == CTRL_EntityKind_Thread) + if(entity->kind == CTRL_EntityKind_Thread && include_extras) { F32 ext_size = size*0.95f; dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" ")); @@ -3274,7 +3289,7 @@ rd_window_frame(RD_Window *ws) String8 arch_str = string_from_arch(arch); DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, thread, rd_rgba_from_theme_color(RD_ThemeColor_TextWeak), - ui_top_font_size()); + ui_top_font_size(), 0); // TODO(rjf): @msgs show stop info (just icon or shortened description) @@ -3826,7 +3841,7 @@ rd_window_frame(RD_Window *ws) UI_TextAlignment(UI_TextAlign_Center) UI_TextPadding(ui_top_font_size()*1.5f) { - DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size()); + DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 0); UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); ui_box_equip_display_fancy_strings(title_box, &fstrs); if(ctrl_entity->kind == CTRL_EntityKind_Thread) @@ -13493,6 +13508,7 @@ rd_frame(void) } // rjf: retry on stopped, pending debug info + // TODO(rjf): CANNOT RETRY IN THIS WAY, NEED TO DEFER TO NEXT FRAME if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip)) { rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle); @@ -14476,6 +14492,9 @@ rd_frame(void) if(rd_regs()->unwind_count < rich_unwind.frames.concrete_frame_count) { D_UnwindFrame *frame = &rich_unwind.frames.v[rd_regs()->unwind_count]; + U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, frame->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + rd_state->base_regs.v.module = module->handle; rd_state->base_regs.v.unwind_count = rd_regs()->unwind_count; rd_state->base_regs.v.inline_depth = 0; if(rd_regs()->inline_depth <= frame->inline_frame_count) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index bd0253ca..acf2666f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1176,7 +1176,7 @@ internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity * internal Vec4F32 rd_rgba_from_ctrl_entity(CTRL_Entity *entity); internal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity); -internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size); +internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras); //////////////////////////////// //~ rjf: Evaluation Spaces diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 029b65c7..a5145a36 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1089,6 +1089,10 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa result = str8_lit("???"); } } + else + { + result = str8_lit("???"); + } di_scope_close(di_scope); scratch_end(scratch); }break; @@ -1209,9 +1213,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } RD_WatchViewRowCtrl row_ctrls_[] = { - {RD_EntityKind_Target, RD_CmdKind_LaunchAndRun }, - {RD_EntityKind_Target, RD_CmdKind_LaunchAndInit }, - {RD_EntityKind_Target, RD_CmdKind_SelectEntity }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, + {RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_FreezeThread }, }; RD_WatchViewRowCtrl *row_ctrls = row_ctrls_; U64 row_ctrls_count = ArrayCount(row_ctrls_); @@ -1375,7 +1380,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, mark_rows.first, &row_info); if(row_kind == RD_WatchViewRowKind_PrettyEntityControls) { - cursor_x_range = r1s64(1, 1+row_ctrls_count); + U64 row_ctrl_count = 0; + for EachIndex(idx, row_ctrls_count) + { + if(row_ctrls[idx].entity_kind == row_info.collection_entity->kind && + row_ctrls[idx].ctrl_entity_kind == row_info.collection_ctrl_entity->kind) + { + row_ctrl_count += 1; + } + } + cursor_x_range = r1s64(1, 1+row_ctrl_count); } } cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count-1)); @@ -1540,7 +1554,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } }break; case RD_WatchViewRowKind_PrettyEntityControls: - if(!rd_entity_is_nil(row_info.collection_entity) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1) + if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1) { kind = OpKind_DoExpand; }break; @@ -2157,6 +2171,23 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo B32 row_selected = (selection_tbl.min.y <= global_row_idx && global_row_idx <= selection_tbl.max.y); B32 row_expanded = ev_expansion_from_key(eval_view, row->key); E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); + CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row_eval.space); + CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module); + switch(row_ctrl_entity->kind) + { + default: + case CTRL_EntityKind_Process: + if(row_eval.mode == E_Mode_Offset) + { + row_module = ctrl_module_from_process_vaddr(row_ctrl_entity, row_eval.value.u64); + }break; + case CTRL_EntityKind_Thread: + 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); + }break; + } E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key); B32 row_is_expandable = ev_row_is_expandable(row); B32 row_is_editable = ev_row_is_editable(row); @@ -2243,7 +2274,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo ////////////////////// //- rjf: build row contents // - UI_Parent(row_box) switch(row_kind) + RD_RegsScope(.module = row_module->handle) UI_Parent(row_box) switch(row_kind) { //////////////////// //- rjf: header row @@ -2434,6 +2465,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); } + if(ctrl_entity->kind == RD_EntityKind_Thread && ctrl_handle_match(ctrl_entity->handle, rd_regs()->thread)) + { + palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton); + } //- rjf: build add-new buttons if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_Target) @@ -2447,8 +2482,20 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } //- rjf: build entity box - if(!rd_entity_is_nil(entity)) + if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil) { + //- rjf: unpack entity info + DR_FancyStringList fstrs = {0}; + if(!rd_entity_is_nil(entity)) + { + fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); + } + else if(ctrl_entity != &ctrl_entity_nil) + { + fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 1); + } + + //- rjf: build ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *entity_box = &ui_nil_box; UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) @@ -2458,7 +2505,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo UI_BoxFlag_DrawBackground| UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawActiveEffects, - "###entity_%p", entity); + "###entity_%p_%p", entity, ctrl_entity); } { UI_Parent(entity_box) @@ -2467,7 +2514,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { next_row_expanded = !row_expanded; } - DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size()); UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); ui_box_equip_display_fancy_strings(title_box, &fstrs); UI_Signal sig = ui_signal_from_box(entity_box); @@ -2490,27 +2536,43 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo for EachIndex(idx, row_ctrls_count) { RD_WatchViewRowCtrl *ctrl = &row_ctrls[idx]; - if(ctrl->entity_kind == entity->kind) + if(ctrl->entity_kind == entity->kind && + ctrl->ctrl_entity_kind == ctrl_entity->kind) { UI_FocusHot(row_selected && selection_tbl.min.x <= ctrl_idx+1 && ctrl_idx+1 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off) { + B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity); RD_IconKind icon_kind = rd_cmd_kind_info_table[ctrl->kind].icon_kind; + UI_Palette *palette = ui_top_palette(); if(ctrl->kind == RD_CmdKind_SelectEntity) { icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled; } - UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx); - if(ui_clicked(sig)) + if(ctrl->kind == RD_CmdKind_FreezeThread) { - if(ctrl->kind == RD_CmdKind_SelectEntity) + icon_kind = is_frozen ? RD_IconKind_Locked : RD_IconKind_Unlocked; + palette = rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton); + } + UI_Palette(palette) + { + UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx); + if(ui_clicked(sig)) { - rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : - sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : - RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); - } - else - { - rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity)); + if(ctrl->kind == RD_CmdKind_SelectEntity) + { + rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : + sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : + RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); + } + else if(ctrl->kind == RD_CmdKind_FreezeThread) + { + rd_cmd(is_frozen ? RD_CmdKind_ThawThread : RD_CmdKind_FreezeThread, + .ctrl_entity = ctrl_entity->handle); + } + else + { + rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity)); + } } } } @@ -2519,45 +2581,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } } } - - //- rjf: build ctrl entity box - if(ctrl_entity != &ctrl_entity_nil) - { - ui_set_next_hover_cursor(OS_Cursor_HandPoint); - UI_Box *entity_box = &ui_nil_box; - UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette) - { - entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###entity_%p", ctrl_entity); - } - { - UI_Parent(entity_box) - { - // rjf: build expander, title - UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded")))) - { - next_row_expanded = !row_expanded; - } - DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size()); - UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); - ui_box_equip_display_fancy_strings(title_box, &fstrs); - UI_Signal sig = ui_signal_from_box(entity_box); - if(ui_clicked(sig)) - { - if(entity->kind == RD_EntityKind_Target) - { - rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : - sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : - RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); - } - } - } - } - } }break; //////////////////// @@ -6170,22 +6193,6 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) default: break; case RD_CmdKind_GoToAddress: { - RD_Entity *process = &d_nil_entity; - { - RD_Entity *entity = rd_entity_from_handle(cmd->regs->entity); - if(!rd_entity_is_nil(entity) && - (entity->kind == RD_EntityKind_Process || - entity->kind == RD_EntityKind_Thread || - entity->kind == RD_EntityKind_Module)) - { - process = entity; - if(entity->kind == RD_EntityKind_Thread || - entity->kind == RD_EntityKind_Module) - { - process = rd_entity_ancestor_from_kind(process, RD_EntityKind_Process); - } - } - } dv->goto_vaddr = cmd->regs->vaddr; }break; case RD_CmdKind_ToggleCodeBytesVisibility: {dv->style_flags ^= DASM_StyleFlag_CodeBytes;}break; @@ -6204,13 +6211,16 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) ////////////////////////////// //- rjf: do goto vaddr // - if(!is_loading && has_disasm && dv->goto_vaddr != 0) + if(!is_loading && has_disasm && dv->goto_vaddr != 0 && contains_1u64(range, dv->goto_vaddr)) { U64 vaddr = dv->goto_vaddr; - dv->goto_vaddr = 0; U64 line_idx = dasm_line_array_idx_from_code_off__linear_scan(&dasm_info.lines, vaddr-range.min); - S64 line_num = (S64)(line_idx+1); - cv->goto_line_num = line_num; + if(line_idx < dasm_info.lines.count) + { + S64 line_num = (S64)(line_idx+1); + dv->goto_vaddr = 0; + cv->goto_line_num = line_num; + } } ////////////////////////////// diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index a6e8b0ea..db1aeceb 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -97,6 +97,7 @@ typedef struct RD_WatchViewRowCtrl RD_WatchViewRowCtrl; struct RD_WatchViewRowCtrl { RD_EntityKind entity_kind; + CTRL_EntityKind ctrl_entity_kind; RD_CmdKind kind; };