disable single-step-stuck-thread behavior when launching-and-initing, such that breakpoints on entry point will not be stepped over

This commit is contained in:
Ryan Fleury
2024-03-22 17:17:08 -07:00
parent 995804cc78
commit c26274ac70
5 changed files with 92 additions and 59 deletions
+17 -1
View File
@@ -1715,6 +1715,11 @@ ctrl_thread__entry_point(void *p)
//- rjf: get next messages
CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena);
//- rjf: enable stuck-thread-step behavior in all cases - can be silently enabled by launch_and_init for subsequent messages
{
ctrl_state->disable_stuck_thread_step = 0;
}
//- rjf: process messages
DMN_CtrlExclusiveAccessScope
{
@@ -2658,6 +2663,13 @@ ctrl_thread__launch_and_init(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)
ctrl_c2u_push_events(&evts);
}
//////////////////////////////
//- rjf: disable 'step-over-stuck' behavior
//
{
ctrl_state->disable_stuck_thread_step = 1;
}
scratch_end(scratch);
ProfEnd();
}
@@ -2862,7 +2874,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)
// the user breakpoint.
//
B32 target_thread_is_on_user_bp_and_trap_net_trap = 0;
if(stop_event == 0)
if(ctrl_state->disable_stuck_thread_step)
{
ctrl_state->disable_stuck_thread_step = 0;
}
else if(stop_event == 0 && !ctrl_state->disable_stuck_thread_step)
{
// rjf: gather stuck threads
DMN_HandleList stuck_threads = {0};
+3 -2
View File
@@ -522,6 +522,7 @@ struct CTRL_State
String8List user_entry_points;
U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64];
U64 process_counter;
B32 disable_stuck_thread_step;
// rjf: user -> memstream ring buffer
U64 u2ms_ring_size;
@@ -694,8 +695,8 @@ internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena);
internal void ctrl_thread__entry_point(void *p);
//- rjf: breakpoint resolution
internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);
internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);
internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);
internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_MachineID machine_id, DMN_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);
//- rjf: attached process running/event gathering
internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof);