Eric Pouech : dbghelp: Fix StackWalk when dwarf or pdb unwinders are called on first frame ( CPU i386).
Module: wine Branch: master Commit: 44eed2465c92ba6321f25ed70b3cd81b76c74c51 URL: http://source.winehq.org/git/wine.git/?a=commit;h=44eed2465c92ba6321f25ed70b... Author: Eric Pouech <eric.pouech(a)orange.fr> Date: Sun Mar 13 21:30:21 2011 +0100 dbghelp: Fix StackWalk when dwarf or pdb unwinders are called on first frame (CPU i386). --- dlls/dbghelp/cpu_i386.c | 25 +++++++++++-------------- 1 files changed, 11 insertions(+), 14 deletions(-) diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c index 6913b1b..817033b 100644 --- a/dlls/dbghelp/cpu_i386.c +++ b/dlls/dbghelp/cpu_i386.c @@ -217,26 +217,23 @@ static BOOL i386_stack_walk(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CO { DWORD_PTR xframe; struct pdb_cmd_pair cpair[4]; + CONTEXT newctx = *context; - if (dwarf2_virtual_unwind(csw, frame->AddrPC.Offset - deltapc, context, &xframe)) + if (dwarf2_virtual_unwind(csw, frame->AddrPC.Offset - deltapc, &newctx, &xframe)) { - frame->AddrStack.Mode = frame->AddrFrame.Mode = frame->AddrReturn.Mode = AddrModeFlat; - frame->AddrStack.Offset = context->Esp = xframe; - frame->AddrFrame.Offset = context->Ebp; - frame->AddrReturn.Offset = context->Eip; + frame->AddrReturn.Mode = AddrModeFlat; + frame->AddrReturn.Offset = newctx.Eip; goto done_pep; } - cpair[0].name = "$ebp"; cpair[0].pvalue = &context->Ebp; - cpair[1].name = "$esp"; cpair[1].pvalue = &context->Esp; - cpair[2].name = "$eip"; cpair[2].pvalue = &context->Eip; - cpair[3].name = NULL; cpair[3].pvalue = NULL; + cpair[0].name = "$ebp"; cpair[0].pvalue = &newctx.Ebp; + cpair[1].name = "$esp"; cpair[1].pvalue = &newctx.Esp; + cpair[2].name = "$eip"; cpair[2].pvalue = &newctx.Eip; + cpair[3].name = NULL; cpair[3].pvalue = NULL; - if (pdb_virtual_unwind(csw, frame->AddrPC.Offset - deltapc, context, cpair)) + if (pdb_virtual_unwind(csw, frame->AddrPC.Offset - deltapc, &newctx, cpair)) { - frame->AddrStack.Mode = frame->AddrFrame.Mode = frame->AddrReturn.Mode = AddrModeFlat; - frame->AddrStack.Offset = context->Esp; - frame->AddrFrame.Offset = context->Ebp; - frame->AddrReturn.Offset = context->Eip; + frame->AddrReturn.Mode = AddrModeFlat; + frame->AddrReturn.Offset = newctx.Eip; goto done_pep; } }
participants (1)
-
Alexandre Julliard