begin floating thread/frame selection mechanisms into frontend and out of engine

This commit is contained in:
Ryan Fleury
2024-09-12 14:58:48 -07:00
parent 638140ab87
commit 3641c212b2
9 changed files with 282 additions and 196 deletions
-6
View File
@@ -252,14 +252,8 @@ D_CmdTable: // | | | |
{Restart 1 1 Null null Nil 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all running processes, then restarts the targets which were used to launch all current processes (if any)." "restart,retry" }
{StepInto 1 1 Null null Nil 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either line or instructions." "" }
{StepOver 1 1 Null null Nil 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either line or instructions." "" }
{RunToCursor 1 1 Null null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "line" }
{SetNextStatement 1 1 Null null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" }
//- rjf: debug control context management operations
{SelectThread 1 1 Entity null Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" }
{SelectUnwind 0 1 Null null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" }
{UpOneFrame 1 1 Null null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" }
{DownOneFrame 1 1 Null null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" }
{FreezeThread 1 1 Entity null Thread 0 0 0 0 0 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" }
{ThawThread 1 1 Entity null Thread 0 0 0 0 0 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" }
{FreezeProcess 1 1 Entity null Process 0 0 0 0 0 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" }
+64 -160
View File
@@ -3859,12 +3859,12 @@ d_init(void)
d_state->ctrl_last_run_arena = arena_alloc();
}
internal CTRL_EventList
internal D_EventList
d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
{
ProfBeginFunction();
Temp scratch = scratch_begin(&arena, 1);
CTRL_EventList result = {0};
D_EventList result = {0};
d_state->frame_index += 1;
arena_clear(d_frame_arena());
d_state->frame_eval_memread_endt_us = os_now_microseconds() + 5000;
@@ -3881,9 +3881,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
U64 new_reg_gen = ctrl_reg_gen();
//- rjf: consume & process events
result = ctrl_c2u_pop_events(arena);
ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &result);
for(CTRL_EventNode *event_n = result.first;
CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena);
ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events);
for(CTRL_EventNode *event_n = events.first;
event_n != 0;
event_n = event_n->next)
{
@@ -3914,7 +3914,30 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
B32 should_snap = !(d_state->ctrl_soft_halt_issued);
d_state->ctrl_is_running = 0;
d_state->ctrl_soft_halt_issued = 0;
D_Entity *stop_thread = d_entity_from_ctrl_handle(event->entity);
// rjf: exception or unexpected trap -> push error
if(event->cause == CTRL_EventCause_InterruptedByException ||
event->cause == CTRL_EventCause_InterruptedByTrap)
{
log_user_error(str8_zero());
}
// rjf: kill all entities which are marked to die on stop
{
D_Entity *request = d_entity_from_id(event->msg_id);
if(d_entity_is_nil(request))
{
for(D_Entity *entity = d_entity_root();
!d_entity_is_nil(entity);
entity = d_entity_rec_depth_first_pre(entity, d_entity_root()).next)
{
if(entity->flags & D_EntityFlag_DiesOnRunStop)
{
d_entity_mark_for_deletion(entity);
}
}
}
}
// rjf: gather stop info
{
@@ -3923,6 +3946,26 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string);
}
// rjf: push stop event to caller, if this is not a soft-halt
if(should_snap)
{
D_EventCause cause = D_EventCause_Null;
switch(event->cause)
{
default:{}break;
case CTRL_EventCause_UserBreakpoint:{cause = D_EventCause_UserBreakpoint;}break;
}
D_EventNode *n = push_array(arena, D_EventNode, 1);
SLLQueuePush(result.first, result.last, n);
result.count += 1;
D_Event *evt = &n->v;
evt->kind = D_EventKind_Stop;
evt->cause = cause;
evt->vaddr = event->rip_vaddr;
}
#if 0 // TODO(rjf): @msgs
D_Entity *stop_thread = d_entity_from_ctrl_handle(event->entity);
// rjf: select & snap to thread causing stop
if(should_snap && stop_thread->kind == D_EntityKind_Thread)
{
@@ -3931,7 +3974,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
}
// rjf: if no stop-causing thread, and if selected thread, snap to selected
#if 0 // TODO(rjf): @msgs
if(should_snap && d_entity_is_nil(stop_thread))
{
D_Entity *selected_thread = d_entity_from_handle(d_regs()->thread);
@@ -3940,7 +3982,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
df_cmd(DF_CmdKind_FindThread, .thread = d_handle_from_entity(selected_thread));
}
}
#endif
// rjf: thread hit user breakpoint -> increment breakpoint hit count
if(should_snap && event->cause == CTRL_EventCause_UserBreakpoint)
@@ -3981,30 +4022,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
}
}
}
// rjf: exception or unexpected trap -> push error
if(event->cause == CTRL_EventCause_InterruptedByException ||
event->cause == CTRL_EventCause_InterruptedByTrap)
{
log_user_error(str8_zero());
}
// rjf: kill all entities which are marked to die on stop
{
D_Entity *request = d_entity_from_id(event->msg_id);
if(d_entity_is_nil(request))
{
for(D_Entity *entity = d_entity_root();
!d_entity_is_nil(entity);
entity = d_entity_rec_depth_first_pre(entity, d_entity_root()).next)
{
if(entity->flags & D_EntityFlag_DiesOnRunStop)
{
d_entity_mark_for_deletion(entity);
}
}
}
}
#endif
}break;
//- rjf: entity creation/deletion
@@ -4096,6 +4114,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
// rjf: equip color
d_entity_equip_color_rgba(entity, thread_color);
#if 0 // TODO(rjf): @msgs
// rjf: automatically select if we don't have a selected thread
D_Entity *selected_thread = d_entity_from_handle(d_state->base_regs.v.thread);
if(d_entity_is_nil(selected_thread))
@@ -4110,6 +4129,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
{
d_cmd(D_CmdKind_SelectThread, .entity = d_handle_from_entity(entity));
}
#endif
}break;
case CTRL_EventKind_NewModule:
@@ -4673,15 +4693,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
ctrl_halt();
}break;
case D_CmdKind_SoftHaltRefresh:
if(d_ctrl_targets_running())
{
if(d_ctrl_targets_running())
{
need_run = 1;
run_kind = d_state->ctrl_last_run_kind;
run_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, d_state->ctrl_last_run_thread_handle);
run_flags = d_state->ctrl_last_run_flags;
run_traps = d_state->ctrl_last_run_traps;
}
need_run = 1;
run_kind = d_state->ctrl_last_run_kind;
run_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, d_state->ctrl_last_run_thread_handle);
run_flags = d_state->ctrl_last_run_flags;
run_traps = d_state->ctrl_last_run_traps;
}break;
case D_CmdKind_SetThreadIP:
{
@@ -4776,7 +4794,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
case D_CmdKind_StepInto:
case D_CmdKind_StepOver:
{
D_EntityList processes = d_query_cached_entity_list_with_kind(D_EntityKind_Process);
CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process);
if(processes.count != 0)
{
D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto
@@ -4797,127 +4815,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
d_cmd(D_CmdKind_LaunchAndInit, .entity_list = d_handle_list_from_entity_list(scratch.arena, targets));
}
}break;
case D_CmdKind_RunToCursor:
{
String8 file_path = d_regs()->file_path;
if(file_path.size != 0)
{
d_cmd(D_CmdKind_RunToLine, .file_path = file_path, .text_point = d_regs()->cursor);
}
else
{
d_cmd(D_CmdKind_RunToAddress, .vaddr = d_regs()->vaddr_range.min);
}
}break;
case D_CmdKind_SetNextStatement:
{
D_Entity *thread = d_entity_from_handle(d_regs()->thread);
String8 file_path = d_regs()->file_path;
U64 new_rip_vaddr = d_regs()->vaddr_range.min;
if(file_path.size != 0)
{
D_LineList *lines = &d_regs()->lines;
for(D_LineNode *n = lines->first; n != 0; n = n->next)
{
D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key);
D_Entity *module = d_module_from_thread_candidates(thread, &modules);
if(!d_entity_is_nil(module))
{
new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min);
break;
}
}
}
d_cmd(D_CmdKind_SetThreadIP, .entity = d_handle_from_entity(thread), .vaddr = new_rip_vaddr);
}break;
//- rjf: debug control context management operations
case D_CmdKind_SelectThread:
{
D_Entity *thread = d_entity_from_handle(params.entity);
D_Entity *module = d_module_from_thread(thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
d_state->base_regs.v.unwind_count = 0;
d_state->base_regs.v.inline_depth = 0;
d_state->base_regs.v.thread = d_handle_from_entity(thread);
d_state->base_regs.v.module = d_handle_from_entity(module);
d_state->base_regs.v.process = d_handle_from_entity(process);
#if 0 // TODO(rjf): @msgs
df_cmd(DF_CmdKind_FindThread, .thread = d_handle_from_entity(thread));
#endif
}break;
case D_CmdKind_SelectUnwind:
{
DI_Scope *di_scope = di_scope_open();
D_Entity *thread = d_entity_from_handle(d_state->base_regs.v.thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread);
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
if(params.unwind_index < rich_unwind.frames.concrete_frame_count)
{
D_UnwindFrame *frame = &rich_unwind.frames.v[params.unwind_index];
d_state->base_regs.v.unwind_count = params.unwind_index;
d_state->base_regs.v.inline_depth = 0;
if(params.inline_depth <= frame->inline_frame_count)
{
d_state->base_regs.v.inline_depth = params.inline_depth;
}
}
#if 0 // TODO(rjf): @msgs
df_cmd(DF_CmdKind_FindThread, .thread = d_handle_from_entity(thread));
#endif
di_scope_close(di_scope);
}break;
case D_CmdKind_UpOneFrame:
case D_CmdKind_DownOneFrame:
{
DI_Scope *di_scope = di_scope_open();
D_Entity *thread = d_entity_from_handle(d_state->base_regs.v.thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread);
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
U64 crnt_unwind_idx = d_state->base_regs.v.unwind_count;
U64 crnt_inline_dpt = d_state->base_regs.v.inline_depth;
U64 next_unwind_idx = crnt_unwind_idx;
U64 next_inline_dpt = crnt_inline_dpt;
if(crnt_unwind_idx < rich_unwind.frames.concrete_frame_count)
{
D_UnwindFrame *f = &rich_unwind.frames.v[crnt_unwind_idx];
switch(cmd->kind)
{
default:{}break;
case D_CmdKind_UpOneFrame:
{
if(crnt_inline_dpt < f->inline_frame_count)
{
next_inline_dpt += 1;
}
else if(crnt_unwind_idx > 0)
{
next_unwind_idx -= 1;
next_inline_dpt = 0;
}
}break;
case D_CmdKind_DownOneFrame:
{
if(crnt_inline_dpt > 0)
{
next_inline_dpt -= 1;
}
else if(crnt_unwind_idx < rich_unwind.frames.concrete_frame_count)
{
next_unwind_idx += 1;
next_inline_dpt = (f+1)->inline_frame_count;
}
}break;
}
}
d_cmd(D_CmdKind_SelectUnwind,
.unwind_index = next_unwind_idx,
.inline_depth = next_inline_dpt);
di_scope_close(di_scope);
}break;
case D_CmdKind_FreezeThread:
case D_CmdKind_ThawThread:
case D_CmdKind_FreezeProcess:
@@ -5068,6 +4967,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints)
ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy);
if(d_state->ctrl_msgs.count != 0)
{
if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_is_running)
{
d_state->ctrl_soft_halt_issued = 1;
ctrl_halt();
}
if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100))
{
MemoryZeroStruct(&d_state->ctrl_msgs);
+44 -1
View File
@@ -41,6 +41,49 @@ struct D_BreakpointArray
U64 count;
};
////////////////////////////////
//~ rjf: Tick Output Types
typedef enum D_EventKind
{
D_EventKind_Null,
D_EventKind_Stop,
D_EventKind_COUNT
}
D_EventKind;
typedef enum D_EventCause
{
D_EventCause_Null,
D_EventCause_UserBreakpoint,
D_EventCause_COUNT
}
D_EventCause;
typedef struct D_Event D_Event;
struct D_Event
{
D_EventKind kind;
D_EventCause cause;
CTRL_Handle thread;
U64 vaddr;
};
typedef struct D_EventNode D_EventNode;
struct D_EventNode
{
D_EventNode *next;
D_Event v;
};
typedef struct D_EventList D_EventList;
struct D_EventList
{
D_EventNode *first;
D_EventNode *last;
U64 count;
};
////////////////////////////////
//~ rjf: Handles
@@ -1046,6 +1089,6 @@ internal B32 d_next_cmd(D_Cmd **cmd);
//~ rjf: Main Layer Top-Level Calls
internal void d_init(void);
internal CTRL_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints);
internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints);
#endif // DBG_ENGINE_CORE_H
@@ -107,12 +107,6 @@ D_CmdKind_Run,
D_CmdKind_Restart,
D_CmdKind_StepInto,
D_CmdKind_StepOver,
D_CmdKind_RunToCursor,
D_CmdKind_SetNextStatement,
D_CmdKind_SelectThread,
D_CmdKind_SelectUnwind,
D_CmdKind_UpOneFrame,
D_CmdKind_DownOneFrame,
D_CmdKind_FreezeThread,
D_CmdKind_ThawThread,
D_CmdKind_FreezeProcess,
+8 -3
View File
@@ -113,12 +113,15 @@ DF_CmdTable: // | | | |
//- rjf: command runner
{RunCommand 1 1 String commands Nil 0 0 0 0 0 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" }
//- rjf: notifications
{Error 0 1 Null null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" }
//- rjf: os event passthrough
{OSEvent 0 0 Null null Nil 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" }
//- rjf: thread/frame selection
{SelectThread 1 1 Entity null Thread 0 0 0 0 0 1 Null "select_thread" "Select Thread" "Selects a thread." "" }
{SelectUnwind 0 1 Null null Nil 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" }
{UpOneFrame 1 1 Null null Nil 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" }
{DownOneFrame 1 1 Null null Nil 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" }
//- rjf: font sizes
{IncUIFontScale 1 1 Null null Nil 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" }
{DecUIFontScale 1 1 Null null Nil 0 0 0 0 0 0 Null "dec_ui_font_scale" "Decrease UI Font Scale" "Decreases the font size used for UI." "" }
@@ -310,6 +313,8 @@ DF_CmdTable: // | | | |
//- rjf: cursor operations
{ToggleBreakpointAtCursor 1 1 Null null Nil 0 0 0 0 0 0 CircleFilled "toggle_breakpoint_cursor" "Toggle Breakpoint At Cursor" "Places or removes a breakpoint on the line on which the active cursor sits." "" }
{ToggleWatchPinAtCursor 1 1 String null Nil 0 0 0 0 1 1 Binoculars "toggle_watch_pin_at_cursor" "Toggle Watch Pin At Cursor" "Places or removes a watch pin at the cursor on the currently active file." "" }
{RunToCursor 1 1 Null null Nil 0 0 0 0 0 0 Play "run_to_cursor" "Run To Cursor" "Runs the selected thread to the current cursor." "line" }
{SetNextStatement 1 1 Null null Nil 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" }
//- rjf: targets
{AddTarget 1 1 FilePath null Nil 1 0 0 0 0 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" }
+153 -2
View File
@@ -11504,6 +11504,38 @@ df_frame(void)
txt_scope_close(txt_scope);
hs_scope_close(hs_scope);
}break;
case DF_CmdKind_RunToCursor:
{
if(df_regs()->file_path.size != 0)
{
df_cmd(DF_CmdKind_RunToLine);
}
else
{
df_cmd(DF_CmdKind_RunToAddress);
}
}break;
case DF_CmdKind_SetNextStatement:
{
D_Entity *thread = d_entity_from_handle(df_regs()->thread);
String8 file_path = df_regs()->file_path;
U64 new_rip_vaddr = df_regs()->vaddr_range.min;
if(file_path.size != 0)
{
D_LineList *lines = &df_regs()->lines;
for(D_LineNode *n = lines->first; n != 0; n = n->next)
{
D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &n->v.dbgi_key);
D_Entity *module = d_module_from_thread_candidates(thread, &modules);
if(!d_entity_is_nil(module))
{
new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min);
break;
}
}
}
d_cmd(D_CmdKind_SetThreadIP, .entity = d_handle_from_entity(thread), .vaddr = new_rip_vaddr);
}break;
//- rjf: targets
case DF_CmdKind_AddTarget:
@@ -11587,7 +11619,7 @@ df_frame(void)
log_infof("\"#MARKER\"");
}break;
//- rjf: OS events
//- rjf: os event passthrough
case DF_CmdKind_OSEvent:
{
OS_Event *os_event = df_regs()->os_event;
@@ -11620,6 +11652,89 @@ df_frame(void)
}
}break;
//- rjf: debug control context management operations
case DF_CmdKind_SelectThread:
{
D_Entity *thread = d_entity_from_handle(df_regs()->thread);
D_Entity *module = d_module_from_thread(thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
df_state->base_regs.v.unwind_count = 0;
df_state->base_regs.v.inline_depth = 0;
df_state->base_regs.v.thread = d_handle_from_entity(thread);
df_state->base_regs.v.module = d_handle_from_entity(module);
df_state->base_regs.v.process = d_handle_from_entity(process);
df_cmd(DF_CmdKind_FindThread, .thread = d_handle_from_entity(thread));
}break;
case DF_CmdKind_SelectUnwind:
{
DI_Scope *di_scope = di_scope_open();
D_Entity *thread = d_entity_from_handle(df_base_regs()->thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread);
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
if(df_regs()->unwind_count < rich_unwind.frames.concrete_frame_count)
{
D_UnwindFrame *frame = &rich_unwind.frames.v[df_regs()->unwind_count];
df_state->base_regs.v.unwind_count = df_regs()->unwind_count;
df_state->base_regs.v.inline_depth = 0;
if(df_regs()->inline_depth <= frame->inline_frame_count)
{
d_state->base_regs.v.inline_depth = df_regs()->inline_depth;
}
}
df_cmd(DF_CmdKind_FindThread, .thread = d_handle_from_entity(thread));
di_scope_close(di_scope);
}break;
case DF_CmdKind_UpOneFrame:
case DF_CmdKind_DownOneFrame:
{
DI_Scope *di_scope = di_scope_open();
D_Entity *thread = d_entity_from_handle(df_base_regs()->thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread);
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
U64 crnt_unwind_idx = d_state->base_regs.v.unwind_count;
U64 crnt_inline_dpt = d_state->base_regs.v.inline_depth;
U64 next_unwind_idx = crnt_unwind_idx;
U64 next_inline_dpt = crnt_inline_dpt;
if(crnt_unwind_idx < rich_unwind.frames.concrete_frame_count)
{
D_UnwindFrame *f = &rich_unwind.frames.v[crnt_unwind_idx];
switch(kind)
{
default:{}break;
case DF_CmdKind_UpOneFrame:
{
if(crnt_inline_dpt < f->inline_frame_count)
{
next_inline_dpt += 1;
}
else if(crnt_unwind_idx > 0)
{
next_unwind_idx -= 1;
next_inline_dpt = 0;
}
}break;
case DF_CmdKind_DownOneFrame:
{
if(crnt_inline_dpt > 0)
{
next_inline_dpt -= 1;
}
else if(crnt_unwind_idx < rich_unwind.frames.concrete_frame_count)
{
next_unwind_idx += 1;
next_inline_dpt = (f+1)->inline_frame_count;
}
}break;
}
}
df_cmd(DF_CmdKind_SelectUnwind,
.unwind_count = next_unwind_idx,
.inline_depth = next_inline_dpt);
di_scope_close(di_scope);
}break;
//- rjf: meta controls
case DF_CmdKind_Edit:
{
@@ -12101,7 +12216,43 @@ df_frame(void)
//////////////////////////////
//- rjf: tick debug engine
//
d_tick(scratch.arena, &targets, &breakpoints);
D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints);
//////////////////////////////
//- rjf: process debug engine events
//
for(D_EventNode *n = engine_events.first; n != 0; n = n->next)
{
D_Event *evt = &n->v;
switch(evt->kind)
{
default:{}break;
case D_EventKind_Stop:
{
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, evt->thread);
U64 vaddr = evt->vaddr;
// rjf: valid stop thread? -> select & snap
if(thread != &ctrl_entity_nil)
{
// TODO(rjf)
}
// rjf: no stop-causing thread, but have selected thread? -> snap to selected
CTRL_Entity *selected_thread = &ctrl_entity_nil; // TODO(rjf): ctrl_entity_from_handle(d_state->ctrl_entity_store, df_base_regs()->thread);
if(thread == &ctrl_entity_nil && selected_thread != &ctrl_entity_nil)
{
// TODO(rjf)
}
// rjf: increment breakpoint hit counts
if(evt->cause == D_EventCause_UserBreakpoint)
{
}
}break;
}
}
//////////////////////////////
//- rjf: apply new rich hover info
-3
View File
@@ -727,9 +727,6 @@ struct DF_State
U64 view_rule_spec_table_size;
DF_ViewRuleSpec **view_rule_spec_table;
// rjf: cmd param slot -> view spec rule table
DF_CmdParamSlotViewSpecRuleList cmd_param_slot_view_spec_table[D_CmdParamSlot_COUNT];
// rjf: windows
DF_Window *first_window;
DF_Window *last_window;
@@ -64,7 +64,7 @@ Rng1U64 df_reg_slot_range_table[32] =
{OffsetOf(DF_Regs, os_event), OffsetOf(DF_Regs, os_event) + sizeof(OS_Event *)},
};
DF_CmdKindInfo df_cmd_kind_info_table[220] =
DF_CmdKindInfo df_cmd_kind_info_table[219] =
{
{0},
{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), DF_IconKind_Play, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_EntityList, str8_lit_comp(""), D_EntityKind_Target}},
@@ -87,12 +87,6 @@ DF_CmdKindInfo df_cmd_kind_info_table[220] =
{ str8_lit_comp("restart"), str8_lit_comp("Kills all running processes, then restarts the targets which were used to launch all current processes (if any)."), str8_lit_comp("restart,retry"), str8_lit_comp("Restart"), DF_IconKind_Redo, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Into"), DF_IconKind_StepInto, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either line or instructions."), str8_lit_comp(""), str8_lit_comp("Step Over"), DF_IconKind_StepOver, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp("line"), str8_lit_comp("Run To Cursor"), DF_IconKind_Play, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), DF_IconKind_RightArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Thread}},
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*0)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), DF_IconKind_UpArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Down One Frame"), DF_IconKind_DownArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Freeze Thread"), DF_IconKind_Locked, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Thread}},
{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), DF_IconKind_Unlocked, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Thread}},
{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp("Freeze Process"), DF_IconKind_Locked, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Process}},
@@ -106,8 +100,11 @@ DF_CmdKindInfo df_cmd_kind_info_table[220] =
{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_PID, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), DF_IconKind_X, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_String, str8_lit_comp("commands"), D_EntityKind_Nil}},
{ str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*0)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*0)|(DF_CmdKindFlag_ListInIPCDocs*0), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Thread}},
{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp("Select Unwind"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*0)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp("Up One Frame"), DF_IconKind_UpArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp("Down One Frame"), DF_IconKind_DownArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), DF_IconKind_Null, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
@@ -242,6 +239,8 @@ DF_CmdKindInfo df_cmd_kind_info_table[220] =
{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), DF_IconKind_Binoculars, (DF_CmdKindFlag_ListInUI*0)|(DF_CmdKindFlag_ListInIPCDocs*0), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("toggle_breakpoint_cursor"), str8_lit_comp("Places or removes a breakpoint on the line on which the active cursor sits."), str8_lit_comp(""), str8_lit_comp("Toggle Breakpoint At Cursor"), DF_IconKind_CircleFilled, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("toggle_watch_pin_at_cursor"), str8_lit_comp("Places or removes a watch pin at the cursor on the currently active file."), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin At Cursor"), DF_IconKind_Binoculars, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*1)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_String, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("run_to_cursor"), str8_lit_comp("Runs the selected thread to the current cursor."), str8_lit_comp("line"), str8_lit_comp("Run To Cursor"), DF_IconKind_Play, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), DF_IconKind_RightArrow, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*0), DF_RegSlot_Null, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("Add Target"), DF_IconKind_Target, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*1)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_FilePath, str8_lit_comp(""), D_EntityKind_Nil}},
{ str8_lit_comp("remove_target"), str8_lit_comp("Removes an existing target."), str8_lit_comp("delete,remove,target"), str8_lit_comp("Remove Target"), DF_IconKind_Trash, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Target}},
{ str8_lit_comp("edit_target"), str8_lit_comp("Edits an existing target."), str8_lit_comp(""), str8_lit_comp("Edit Target"), DF_IconKind_Pencil, (DF_CmdKindFlag_ListInUI*1)|(DF_CmdKindFlag_ListInIPCDocs*1), {(DF_QueryFlag_AllowFiles*0)|(DF_QueryFlag_AllowFolders*0)|(DF_QueryFlag_CodeInput*0)|(DF_QueryFlag_KeepOldInput*0)|(DF_QueryFlag_SelectOldInput*0)|(DF_QueryFlag_Required*1), DF_RegSlot_Entity, str8_lit_comp(""), D_EntityKind_Target}},
@@ -66,12 +66,6 @@ DF_CmdKind_Run,
DF_CmdKind_Restart,
DF_CmdKind_StepInto,
DF_CmdKind_StepOver,
DF_CmdKind_RunToCursor,
DF_CmdKind_SetNextStatement,
DF_CmdKind_SelectThread,
DF_CmdKind_SelectUnwind,
DF_CmdKind_UpOneFrame,
DF_CmdKind_DownOneFrame,
DF_CmdKind_FreezeThread,
DF_CmdKind_ThawThread,
DF_CmdKind_FreezeProcess,
@@ -85,8 +79,11 @@ DF_CmdKind_ThawEntity,
DF_CmdKind_Attach,
DF_CmdKind_Exit,
DF_CmdKind_RunCommand,
DF_CmdKind_Error,
DF_CmdKind_OSEvent,
DF_CmdKind_SelectThread,
DF_CmdKind_SelectUnwind,
DF_CmdKind_UpOneFrame,
DF_CmdKind_DownOneFrame,
DF_CmdKind_IncUIFontScale,
DF_CmdKind_DecUIFontScale,
DF_CmdKind_IncCodeFontScale,
@@ -221,6 +218,8 @@ DF_CmdKind_AddWatchPin,
DF_CmdKind_ToggleWatchPin,
DF_CmdKind_ToggleBreakpointAtCursor,
DF_CmdKind_ToggleWatchPinAtCursor,
DF_CmdKind_RunToCursor,
DF_CmdKind_SetNextStatement,
DF_CmdKind_AddTarget,
DF_CmdKind_RemoveTarget,
DF_CmdKind_EditTarget,