mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-05 21:38:40 +00:00
fix incorrectly referring to root entity for debug info if missing; fix thread register cache issues; fix new dbgi layer issues
This commit is contained in:
+17
-3
@@ -1459,9 +1459,23 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, C
|
|||||||
B32 need_stale = 1;
|
B32 need_stale = 1;
|
||||||
if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result))
|
if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, result))
|
||||||
{
|
{
|
||||||
need_stale = 0;
|
OS_MutexScopeRWPromote(stripe->rw_mutex)
|
||||||
node->reg_gen = current_reg_gen;
|
{
|
||||||
MemoryCopy(node->block, result, reg_block_size);
|
for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
if(n->machine_id == machine_id && dmn_handle_match(n->thread, thread))
|
||||||
|
{
|
||||||
|
node = n;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(node != 0)
|
||||||
|
{
|
||||||
|
need_stale = 0;
|
||||||
|
node->reg_gen = current_reg_gen;
|
||||||
|
MemoryCopy(node->block, result, reg_block_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(need_stale)
|
if(need_stale)
|
||||||
{
|
{
|
||||||
|
|||||||
+6
-6
@@ -5,12 +5,12 @@
|
|||||||
//~ rjf: Basic Helpers
|
//~ rjf: Basic Helpers
|
||||||
|
|
||||||
internal U64
|
internal U64
|
||||||
di_hash_from_string(String8 string)
|
di_hash_from_string(String8 string, StringMatchFlags match_flags)
|
||||||
{
|
{
|
||||||
U64 result = 5381;
|
U64 result = 5381;
|
||||||
for(U64 i = 0; i < string.size; i += 1)
|
for(U64 i = 0; i < string.size; i += 1)
|
||||||
{
|
{
|
||||||
result = ((result << 5) + result) + string.str[i];
|
result = ((result << 5) + result) + ((match_flags & StringMatchFlag_CaseInsensitive) ? char_to_lower(string.str[i]) : string.str[i]);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -237,7 +237,7 @@ di_open(String8 path, U64 min_timestamp)
|
|||||||
if(path.size != 0)
|
if(path.size != 0)
|
||||||
{
|
{
|
||||||
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
||||||
U64 hash = di_hash_from_string(path_normalized);
|
U64 hash = di_hash_from_string(path_normalized, StringMatchFlag_CaseInsensitive);
|
||||||
U64 slot_idx = hash%di_shared->slots_count;
|
U64 slot_idx = hash%di_shared->slots_count;
|
||||||
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
||||||
DI_Slot *slot = &di_shared->slots[slot_idx];
|
DI_Slot *slot = &di_shared->slots[slot_idx];
|
||||||
@@ -294,7 +294,7 @@ di_close(String8 path, U64 min_timestamp)
|
|||||||
{
|
{
|
||||||
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
||||||
StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context());
|
StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context());
|
||||||
U64 hash = di_hash_from_string(path_normalized);
|
U64 hash = di_hash_from_string(path_normalized, StringMatchFlag_CaseInsensitive);
|
||||||
U64 slot_idx = hash%di_shared->slots_count;
|
U64 slot_idx = hash%di_shared->slots_count;
|
||||||
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
||||||
DI_Slot *slot = &di_shared->slots[slot_idx];
|
DI_Slot *slot = &di_shared->slots[slot_idx];
|
||||||
@@ -353,7 +353,7 @@ di_rdi_from_path_min_timestamp(DI_Scope *scope, String8 path, U64 min_timestamp,
|
|||||||
Temp scratch = scratch_begin(0, 0);
|
Temp scratch = scratch_begin(0, 0);
|
||||||
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
String8 path_normalized = path_normalized_from_string(scratch.arena, path);
|
||||||
StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context());
|
StringMatchFlags match_flags = path_match_flags_from_os(operating_system_from_context());
|
||||||
U64 hash = di_hash_from_string(path_normalized);
|
U64 hash = di_hash_from_string(path_normalized, StringMatchFlag_CaseInsensitive);
|
||||||
U64 slot_idx = hash%di_shared->slots_count;
|
U64 slot_idx = hash%di_shared->slots_count;
|
||||||
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
||||||
DI_Slot *slot = &di_shared->slots[slot_idx];
|
DI_Slot *slot = &di_shared->slots[slot_idx];
|
||||||
@@ -528,7 +528,7 @@ di_parse_thread__entry_point(void *p)
|
|||||||
////////////////////////////
|
////////////////////////////
|
||||||
//- rjf: unpack key
|
//- rjf: unpack key
|
||||||
//
|
//
|
||||||
U64 hash = di_hash_from_string(og_path);
|
U64 hash = di_hash_from_string(og_path, StringMatchFlag_CaseInsensitive);
|
||||||
U64 slot_idx = hash%di_shared->slots_count;
|
U64 slot_idx = hash%di_shared->slots_count;
|
||||||
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
U64 stripe_idx = slot_idx%di_shared->stripes_count;
|
||||||
DI_Slot *slot = &di_shared->slots[slot_idx];
|
DI_Slot *slot = &di_shared->slots[slot_idx];
|
||||||
|
|||||||
+1
-1
@@ -200,7 +200,7 @@ global RDI_Parsed di_rdi_parsed_nil =
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Basic Helpers
|
//~ rjf: Basic Helpers
|
||||||
|
|
||||||
internal U64 di_hash_from_string(String8 string);
|
internal U64 di_hash_from_string(String8 string, StringMatchFlags match_flags);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
//~ rjf: Main Layer Initialization
|
//~ rjf: Main Layer Initialization
|
||||||
|
|||||||
@@ -2185,7 +2185,7 @@ df_entity_from_path(String8 path, DF_EntityFromPathFlags flags)
|
|||||||
// rjf: next parent -> follow it
|
// rjf: next parent -> follow it
|
||||||
parent = next_parent;
|
parent = next_parent;
|
||||||
}
|
}
|
||||||
file_no_override = parent;
|
file_no_override = (parent != df_entity_root() ? parent : &df_g_nil_entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: pass 2: follow overrides
|
//- rjf: pass 2: follow overrides
|
||||||
@@ -2244,7 +2244,7 @@ df_entity_from_path(String8 path, DF_EntityFromPathFlags flags)
|
|||||||
// rjf: next parent -> follow it
|
// rjf: next parent -> follow it
|
||||||
parent = next_parent;
|
parent = next_parent;
|
||||||
}
|
}
|
||||||
file_overrides_applied = parent;
|
file_overrides_applied = (parent != df_entity_root() ? parent : &df_g_nil_entity);;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: pick & return result
|
//- rjf: pick & return result
|
||||||
|
|||||||
+9
-8
@@ -2499,19 +2499,19 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds)
|
|||||||
// rjf: extract thread/rip info
|
// rjf: extract thread/rip info
|
||||||
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
|
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
|
||||||
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
|
DF_Entity *module = df_module_from_process_vaddr(process, rip_vaddr);
|
||||||
DF_Entity *debug = df_dbgi_from_module(module);
|
DF_Entity *dbgi = df_dbgi_from_module(module);
|
||||||
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
|
U64 rip_voff = df_voff_from_vaddr(module, rip_vaddr);
|
||||||
RDI_Parsed *rdi = df_rdi_from_dbgi(scope, debug);
|
RDI_Parsed *rdi = df_rdi_from_dbgi(scope, dbgi);
|
||||||
DF_TextLineDasm2SrcInfo line_info = df_text_line_dasm2src_info_from_dbgi_voff(debug, rip_voff);
|
DF_TextLineDasm2SrcInfo line_info = df_text_line_dasm2src_info_from_dbgi_voff(dbgi, rip_voff);
|
||||||
|
|
||||||
// rjf: snap to resolved line
|
// rjf: snap to resolved line
|
||||||
B32 missing_rip = (rip_vaddr == 0);
|
B32 missing_rip = (rip_vaddr == 0);
|
||||||
B32 binary_missing = (debug->flags & DF_EntityFlag_IsMissing);
|
B32 dbgi_missing = (dbgi->flags & DF_EntityFlag_IsMissing || df_entity_is_nil(dbgi));
|
||||||
B32 dbg_info_pending = !binary_missing && rdi == &di_rdi_parsed_nil;
|
B32 dbgi_pending = !dbgi_missing && rdi == &di_rdi_parsed_nil;
|
||||||
B32 has_line_info = (line_info.voff_range.max != line_info.voff_range.min);
|
B32 has_line_info = (line_info.voff_range.max != line_info.voff_range.min);
|
||||||
B32 has_module = !df_entity_is_nil(module);
|
B32 has_module = !df_entity_is_nil(module);
|
||||||
B32 has_dbg_info = has_module && !binary_missing;
|
B32 has_dbg_info = has_module && !dbgi_missing;
|
||||||
if(!dbg_info_pending && (has_line_info || has_module))
|
if(!dbgi_pending && (has_line_info || has_module))
|
||||||
{
|
{
|
||||||
DF_CmdParams params = df_cmd_params_from_window(ws);
|
DF_CmdParams params = df_cmd_params_from_window(ws);
|
||||||
if(has_line_info)
|
if(has_line_info)
|
||||||
@@ -2527,12 +2527,13 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds)
|
|||||||
params.index = unwind_count;
|
params.index = unwind_count;
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Entity);
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualOff);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualOff);
|
||||||
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_VirtualAddr);
|
||||||
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Index);
|
df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_Index);
|
||||||
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation));
|
df_cmd_list_push(arena, cmds, ¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation));
|
||||||
}
|
}
|
||||||
|
|
||||||
// rjf: retry on stopped, pending debug info
|
// rjf: retry on stopped, pending debug info
|
||||||
if(!df_ctrl_targets_running() && (dbg_info_pending || missing_rip))
|
if(!df_ctrl_targets_running() && (dbgi_pending || missing_rip))
|
||||||
{
|
{
|
||||||
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread));
|
df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindThread));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user