[PATCH 4/4] [WineDbg]: allow backtraces to properly return address outside functions

Eric Pouech eric.pouech at orange.fr
Tue Mar 30 14:37:22 CDT 2010




A+
---

 programs/winedbg/stack.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)


diff --git a/programs/winedbg/stack.c b/programs/winedbg/stack.c
index 4b2286c..7ba2773 100644
--- a/programs/winedbg/stack.c
+++ b/programs/winedbg/stack.c
@@ -83,6 +83,15 @@ static BOOL stack_get_frame(int nf, IMAGEHLP_STACK_FRAME* ihsf)
 {
     memset(ihsf, 0, sizeof(*ihsf));
     ihsf->InstructionOffset = dbg_curr_thread->frames[nf].linear_pc;
+    /* if we're not the first frame, InstructionOffset is the return address
+     * after the call instruction (at least on most processors I know of).
+     * However, there are cases where this address is outside of the current function.
+     * This happens when the called function is marked <NO RETURN>, in which
+     * case the compiler can omit the epilog (gcc 4 does it)
+     * Therefore, we decrement InstructionOffset in order to ensure that
+     * the considered address is really inside the current function.
+     */
+    if (nf) ihsf->InstructionOffset--;
     ihsf->FrameOffset = dbg_curr_thread->frames[nf].linear_frame;
     ihsf->StackOffset = dbg_curr_thread->frames[nf].linear_stack;
     return TRUE;






More information about the wine-patches mailing list