x64-windows: Fix extraction of chained UNWIND_INFO
authorJoel Brobecker <brobecker@adacore.com>
Wed, 11 Jun 2014 12:07:27 +0000 (14:07 +0200)
committerJoel Brobecker <brobecker@adacore.com>
Fri, 1 Aug 2014 13:55:10 +0000 (06:55 -0700)
On x86_64-windows, GDB is unable to unwind past some code in
mswsock.dll. For instance:

    (gdb) bt
    #0  0x00000000778712fa in ntdll!ZwWaitForSingleObject ()
       from C:\Windows\SYSTEM32\ntdll.dll
    #1  0x000007fefcfb0f75 in WSPStartup ()
       from C:\Windows\system32\mswsock.dll
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)

The UNWIND_INFO record for frame #1's PC has a UNW_FLAG_CHAININFO
flag, and so after having decoded this unwind record, GDB's decoder
next tries to locate the next unwind record on the chain. Unfortunately,
the location of that unwind info appears to be miscomputed. This is
the expression used:

         chain_vma = cache->image_base + unwind_info
           + sizeof (ex_ui) + ((codes_count + 1) & ~1) * 2 + 8;

The chain-info is expected to be right after the "Unwind codes
array" which is itself after all the fields of ex_ui's struct.
So the "+ 8" offset at the end should not be there.

Because of that extra offset, we were reading no longer processing
correct unwind info, leading the unwinder computing the wrong frame
size, computing the wrong return address, etc.

gdb/ChangeLog:

        * amd64-windows-tdep.c (amd64_windows_frame_decode_insns):
        Remove "+ 8" offset in computation of CHAIN_VMA.

gdb/ChangeLog
gdb/amd64-windows-tdep.c

index e494a2aab34bf697337d8122c7d8f76663c780ea..939fd20a7ab549d4ce13c8d0ea56bc47fb939a5f 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-01  Joel Brobecker  <brobecker@adacore.com>
+
+       * amd64-windows-tdep.c (amd64_windows_frame_decode_insns):
+       Remove "+ 8" offset in computation of CHAIN_VMA.
+
 2014-07-31  Doug Evans  <dje@google.com>
 
        * inflow.c (child_terminal_inferior): Add comment.
index 331ce775b8c8c56c72c49c8c6353b080e81d8b0a..cb1bac78612dacb754525b95f40bc7e9a8a5fb51 100644 (file)
@@ -826,7 +826,7 @@ amd64_windows_frame_decode_insns (struct frame_info *this_frame,
          CORE_ADDR chain_vma;
 
          chain_vma = cache->image_base + unwind_info
-           + sizeof (ex_ui) + ((codes_count + 1) & ~1) * 2 + 8;
+           + sizeof (ex_ui) + ((codes_count + 1) & ~1) * 2;
 
          if (target_read_memory (chain_vma, (gdb_byte *) &d, sizeof (d)) != 0)
            return;