fix incorrect commits in new pe/x64 unwinder; fix bad unwind termination conditions

This commit is contained in:
Ryan Fleury
2026-06-09 10:38:08 -07:00
parent 9955c8c1a7
commit ec4fd23e15
3 changed files with 18 additions and 9 deletions
+8 -1
View File
@@ -5,11 +5,18 @@ target:
{ {
executable: "build/raddbg.exe" executable: "build/raddbg.exe"
working_directory: "../raddebugger" working_directory: "../raddebugger"
arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project --capture" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project"
debug_subprocesses: 0 debug_subprocesses: 0
enabled: 1 enabled: 1
} }
target: target:
{
executable: "../raddebugger_exemplar/build/raddbg.exe"
working_directory: "../raddebugger"
arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project"
debug_subprocesses: 0
}
target:
{ {
executable: "build/mule_main.exe" executable: "build/mule_main.exe"
working_directory: build working_directory: build
+4 -2
View File
@@ -1900,7 +1900,9 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
} }
//- rjf: push successful steps to frame list //- rjf: push successful steps to frame list
if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 && arch_ip_from_reg_block(arch_info, regs_block) != start_ip) if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 &&
(arch_ip_from_reg_block(arch_info, regs_block) != start_ip ||
arch_sp_from_reg_block(arch_info, regs_block) != start_sp))
{ {
D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1);
D_UnwindFrame *f = &frame_node->v; D_UnwindFrame *f = &frame_node->v;
@@ -1914,7 +1916,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us)
access_close(access); access_close(access);
//- rjf: exit if we made no progress on the unwind //- rjf: exit if we made no progress on the unwind
if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip || if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip &&
arch_sp_from_reg_block(arch_info, regs_block) == start_sp) arch_sp_from_reg_block(arch_info, regs_block) == start_sp)
{ {
break; break;
+6 -6
View File
@@ -361,7 +361,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8;
X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg);
Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code];
U64 *reg_ptr = (U64 *)((U8 *)&regs + reg_rng.min); U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min);
reg_ptr[0] = value; reg_ptr[0] = value;
new_regs->rsp = sp + 8; new_regs->rsp = sp + 8;
} }
@@ -430,7 +430,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8;
X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg);
Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code];
U64 *reg_ptr = (U64 *)((U8 *)&regs + reg_rng.min); U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min);
U64 reg_value = reg_ptr[0]; U64 reg_value = reg_ptr[0];
// rjf: read immediate // rjf: read immediate
@@ -608,7 +608,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
if(frame_reg_code != X64_RegCode_nil) if(frame_reg_code != X64_RegCode_nil)
{ {
Rng1U16 frame_reg_rng = x64_reg_code_rng_table[frame_reg_code]; Rng1U16 frame_reg_rng = x64_reg_code_rng_table[frame_reg_code];
U64 raw_frame_base = *(U64 *)((U8 *)regs + frame_reg_rng.min); U64 raw_frame_base = *(U64 *)((U8 *)new_regs + frame_reg_rng.min);
U64 adjusted_frame_base = raw_frame_base - frame_off*16; U64 adjusted_frame_base = raw_frame_base - frame_off*16;
frame_base = adjusted_frame_base; frame_base = adjusted_frame_base;
} }
@@ -661,7 +661,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
{ {
X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info);
Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code];
*(U64 *)((U8 *)regs + reg_rng.min) = value; *(U64 *)((U8 *)new_regs + reg_rng.min) = value;
new_regs->rsp = rsp + 8; new_regs->rsp = rsp + 8;
} }
}break; }break;
@@ -720,7 +720,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
{ {
X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info);
Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code];
*(U64 *)((U8 *)regs + reg_rng.min) = value; *(U64 *)((U8 *)new_regs + reg_rng.min) = value;
} }
}break; }break;
@@ -742,7 +742,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info,
{ {
X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info);
Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code];
*(U64 *)((U8 *)regs + reg_rng.min) = value; *(U64 *)((U8 *)new_regs + reg_rng.min) = value;
} }
}break; }break;