[PATCH 4/5] ntdll: Also capture first frame in back trace on x86.

Paul Gofman pgofman at codeweavers.com
Thu Oct 21 11:03:39 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/ntdll/signal_i386.c     | 24 ++++++++++++++++++++++--
 dlls/ntdll/tests/exception.c |  2 --
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 9390ffa3df3..108f140aeb8 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -480,6 +480,25 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
                     "ret $4" )  /* actually never returns */
 
 
+/***********************************************************************
+ *		capture_context_wrapper (NTDLL.@)
+ */
+void WINAPI capture_context_wrapper(CONTEXT *);
+__ASM_STDCALL_FUNC( capture_context_wrapper, 4,
+                    "pushl %ebp\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+                    __ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
+                    "movl %esp,%ebp\n\t"
+                    __ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
+                    "mov 8(%ebp),%eax\n\t"        /* context */
+                    "pushl %eax\n\t"
+                    "call " __ASM_STDCALL("RtlCaptureContext",4) "\n\t"
+                    "leave\n\t"
+                    __ASM_CFI(".cfi_def_cfa %esp,4\n\t")
+                    __ASM_CFI(".cfi_same_value %ebp\n\t")
+                    "ret $4" )
+
+
 /*************************************************************************
  *		capture_stack_back_trace
  */
@@ -515,7 +534,8 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
 {
     CONTEXT context;
 
-    RtlCaptureContext( &context );
+    /* Need a wrapper as RtlCaptureContext() skips the last frame. */
+    capture_context_wrapper( &context );
     return capture_stack_back_trace( &context, skip, count, buffer, hash );
 }
 
@@ -531,7 +551,7 @@ ULONG WINAPI RtlWalkFrameChain(void **callers, ULONG count, ULONG flags)
 
     TRACE( "callers %p, count %u, flags %#x.\n", callers, count, flags );
 
-    RtlCaptureContext( &context );
+    capture_context_wrapper( &context );
 
     skip = (flags >> 8) & 0xff;
     flags &= ~0xff00;
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 63b1edeebc9..1d7f5ed4408 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -9134,10 +9134,8 @@ static void test_walk_stack(void)
 
     start = test_walk_stack;
     end = (BYTE *)start + 0x1000;
-    todo_wine_if(sizeof(void *) == 4)
     ok(addrs[0] >= start && addrs[0] < end, "Address is not inside test function, start %p, end %p, addr %p.\n",
             start, end, addrs[0]);
-    todo_wine_if(sizeof(void *) == 4)
     ok(addrs2[0] >= start && addrs2[0] < end, "Address is not inside test function, start %p, end %p, addr %p.\n",
             start, end, addrs2[0]);
 
-- 
2.31.1




More information about the wine-devel mailing list