treat errored call stacks as valid call stack results - only reject on stale data. allow 0 rips for the top frames.

This commit is contained in:
Ryan Fleury
2026-04-01 11:06:23 -06:00
parent d986ea6cd9
commit 8d67460fa6
+5 -17
View File
@@ -3026,8 +3026,8 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U
U64 rip = regs_rip_from_arch_block(arch, regs_block); U64 rip = regs_rip_from_arch_block(arch, regs_block);
U64 rsp = regs_rsp_from_arch_block(arch, regs_block); U64 rsp = regs_rsp_from_arch_block(arch, regs_block);
// rjf: cancel on 0 rip // rjf: cancel on zero rip (except the top frame)
if(rip == 0) if(rip == 0 && frame_node_count > 0)
{ {
break; break;
} }
@@ -3074,34 +3074,22 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U
CTRL_UnwindStepResult step_result = {0}; CTRL_UnwindStepResult step_result = {0};
switch(process_entity->target_os) switch(process_entity->target_os)
{ {
case OperatingSystem_Null:{}break; default:{}break;
case OperatingSystem_Windows: case OperatingSystem_Windows:
{ {
switch(arch) switch(arch)
{ {
case Arch_Null:{}break; default:{}break;
case Arch_x64: case Arch_x64:
{ {
step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us);
}break; }break;
case Arch_x86:
case Arch_arm32:
case Arch_arm64:
{
NotImplemented;
}break;
default: { InvalidPath; } break;
} }
}break; }break;
case OperatingSystem_Linux: case OperatingSystem_Linux:
{ {
step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us);
}break; }break;
case OperatingSystem_Mac:
{
NotImplemented;
}break;
default: { InvalidPath; }break;
} }
// stop unwinding on errors or stale data // stop unwinding on errors or stale data
@@ -6983,7 +6971,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out,
pre_reg_gen = ctrl_reg_gen(); pre_reg_gen = ctrl_reg_gen();
pre_mem_gen = ctrl_mem_gen(); pre_mem_gen = ctrl_mem_gen();
unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000);
if(unwind.flags == 0) if(!(unwind.flags & CTRL_UnwindFlag_Stale))
{ {
good = 1; good = 1;
call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind);