From ec4fd23e15c79811c9518b1a0bb188cd04ac1868 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 10:38:08 -0700 Subject: [PATCH] fix incorrect commits in new pe/x64 unwinder; fix bad unwind termination conditions --- project.raddbg | 9 ++++++++- src/dbg_engine/dbg_engine_ctrl.c | 6 ++++-- src/pe/x64/unwind/pe_x64_unwind.c | 12 ++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/project.raddbg b/project.raddbg index 929febbb..a3b23cac 100644 --- a/project.raddbg +++ b/project.raddbg @@ -5,11 +5,18 @@ target: { executable: "build/raddbg.exe" 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 enabled: 1 } 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" working_directory: build diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index af3c1627..11881850 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1900,7 +1900,9 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) } //- 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_UnwindFrame *f = &frame_node->v; @@ -1914,7 +1916,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) access_close(access); //- 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) { break; diff --git a/src/pe/x64/unwind/pe_x64_unwind.c b/src/pe/x64/unwind/pe_x64_unwind.c index 2db6604b..7c62dbab 100644 --- a/src/pe/x64/unwind/pe_x64_unwind.c +++ b/src/pe/x64/unwind/pe_x64_unwind.c @@ -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; 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]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); reg_ptr[0] = value; 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; 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]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); U64 reg_value = reg_ptr[0]; // 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) { 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; 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); 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; } }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); 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; @@ -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); 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;