<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56095>56095</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            LLDB fails to unwind through ntdll KiUserExceptionDispatcher/RtlWalkFrameChain
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lldb,
            platform:windows
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mstorsjo
      </td>
    </tr>
</table>

<pre>
    Unwinding through ntdll's KiUserExceptionDispatcher/RtlWalkFrameChain function seems to fail in LLDB, but works with GDB.

To reproduce, use this attached test exe, 
[hello-exception.exe.zip](https://github.com/llvm/llvm-project/files/8931134/hello-exception.exe.zip), set a breakpoint at `_GCC_specific_handler` and run it, and print a back trace.

```
> lldb hello-exception.exe
(lldb) target create "hello-exception.exe"
(rrent executable set to 'C:\code\hello-exception.exe' (x86_64).
(lldb) b _GCC_specific_handler
Breakpoint 1: where = hello-exception.exe`_GCC_specific_handler, address = 0x0000000140005da0
(lldb) r
Process 1168 launched: 'C:\code\hello-exception.exe' (x86_64)
Process 1168 stopped
* thread #1, stop reason = breakpoint 1.1
    frame #0: 0x00007ff65ba55da0 hello-exception.exe`_GCC_specific_handler
hello-exception.exe`_GCC_specific_handler:
->  0x7ff65ba55da0 <+0>: pushq  %r15
    0x7ff65ba55da2 <+2>: pushq  %r14
    0x7ff65ba55da4 <+4>: pushq  %r13
    0x7ff65ba55da6 <+6>: pushq  %r12
(lldb) bt
* thread #1, stop reason = breakpoint 1.1
  * frame #0: 0x00007ff65ba55da0 hello-exception.exe`_GCC_specific_handler
    frame #1: 0x00007ff65ba53fe5 hello-exception.exe`__gxx_personality_seh0 + 21
    frame #2: 0x00007ffb5af146af ntdll.dll`__chkstk + 287
    frame #3: 0x00007ffb5ae74bef ntdll.dll`RtlWalkFrameChain + 5311
```

With the same sequence of commands in GDB, we get a backtrace that does include the earlier part of the call stack too:
```
> gdb hello-exception.exe
GNU gdb (GDB) 12.1
[...]
(gdb) b _GCC_specific_handler
Breakpoint 1 at 0x140005db3
(gdb) r
Starting program: C:\code\hello-exception.exe
[New Thread 5440.0x5b4]
ctor 10
ctor 9
ctor 8
ctor 7
ctor 6
ctor 5
ctor 4
ctor 3
ctor 2
ctor 1
ctor 0

Thread 1 hit Breakpoint 1, 0x00007ff65ba55db3 in _GCC_specific_handler ()
(gdb) bt
#0  0x00007ff65ba55db3 in _GCC_specific_handler ()
#1  0x00007ff65ba53fe5 in __gxx_personality_seh0 ()
#2  0x00007ffb5af146af in ntdll!.chkstk () from C:\Windows\SYSTEM32\ntdll.dll
#3  0x00007ffb5ae74bef in ntdll!RtlWalkFrameChain () from C:\Windows\SYSTEM32\ntdll.dll
#4  0x00007ffb5af1341e in ntdll!KiUserExceptionDispatcher () from C:\Windows\SYSTEM32\ntdll.dll
#5  0x00007ffb57199129 in RaiseException () from C:\Windows\System32\KernelBase.dll
#6  0x00007ff65ba5633a in _Unwind_RaiseException ()
#7  0x00007ff65ba53b23 in __cxa_throw ()
#8  0x00007ff65ba51517 in recurse (val=0) at hello-exception.cpp:59
#9  0x00007ff65ba5160f in recurse (val=1) at hello-exception.cpp:68
#10 0x00007ff65ba5160f in recurse (val=2) at hello-exception.cpp:68
#11 0x00007ff65ba5160f in recurse (val=3) at hello-exception.cpp:68
#12 0x00007ff65ba5160f in recurse (val=4) at hello-exception.cpp:68
#13 0x00007ff65ba51541 in recurse (val=5) at hello-exception.cpp:62
#14 0x00007ff65ba5160f in recurse (val=6) at hello-exception.cpp:68
#15 0x00007ff65ba5160f in recurse (val=7) at hello-exception.cpp:68
#16 0x00007ff65ba5160f in recurse (val=8) at hello-exception.cpp:68
#17 0x00007ff65ba5160f in recurse (val=9) at hello-exception.cpp:68
#18 0x00007ff65ba5160f in recurse (val=10) at hello-exception.cpp:68
#19 0x00007ff65ba51831 in main (argc=1, argv=0x1fc5b559290) at hello-exception.cpp:95
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytWN-TmjoU_mv0JVOGJAThwYeq231ob-dO253OfXJCCEI3Ak1CtfevvyeIiopbtr2OI2GT7zsn52eySZX-nD-Vu6JMi3KDbK6rZpOj0qZKTcjMoPfFk5H6YS9kbYuqXBWm5lbkUk_Iu09WfeXq-Z3mW7nMeVGirCmFW4aMlFuDbIUyXigEMx8-rBYTskRJY9Gu0s8G7Qqbo8fVwpv4q4n_9vD7pUJa1rpKGyHd8sZIUKowiFvLQWyKrDQWyX072yHZIpdKVW_kUUsP5r1_i3rCVhMS5dbWZkLfgsbw3YDYJvFEtYUXpX4cH29A6jcpLLxmhZIGnlFMMaYBjO7xk9ipYaRFHCVa8ue6Kkp4sWgS-uvH5XJtaimKrBDrnJepArOFPoIR0k2JCuvQ7q3WLQwlXDwjq7mQF1YBUPc9vNIHpFSaoAG1uhUkcgtAP2S53oB-ArSzEk0IGQIRcsJpLcvWwKKxPFGy3R04EqJh6YzIlqJKJTwGeWawLtpH4ToEs8XejTYJGrZKu25xtiAGUWgHYQYq09XgRu8Z2Jk0TbU0poX6e__wwQH8sJT7N0p14v_WlXAojMMIKQ6hDPHm9PidrQ9QGlvVNTB24t-6bJM8BRjFbRjBPEQ_N5A_TvNeQGEPH2AIPpnLN4fynXKH_c2yLGQJZ25_r7JWy_oaAO1i8o2LQpB-IXlClxOyAL0enGp1Y_LvCDRlGrOz_hcY0mHIACa4gwk6TDCAoXcwYYcJBzDkNkztH3rJAf9_P114H9-y0kyye6zrzX6_rqUGvbkq7M-1kTk4jCwQGYotcsGeMJ7hIOTZoTN4rjs4TpE_G_t8YIlmAzT0mkbOgkRe0ty2EcfHoPYOV7_296vrHjaH8uQkGfm9kaWQqMoQVPYtGM24rvN4aDo7iTbyWF_b8gpQKNJpJd0yoZpUtmSSa1VIjWqureNyfxNcKfB6W5mr6hT_AzV581JJfvz41C6AKGu1ihEmx3iBDuZ5nutWx0DcvLJcupbj77sSl9Brng7xGZqBdX0eet0GzO2c8-vKdlTxo9yhL4dkYEHge_6eJcFJaWErjbDfe4l746g3nvXGYW_MeuOgN6a9MekL640vYqNTEqO8sOiiqUAsXOdhQl2gDJrZ-epUyntOORUH6qM_4KP4Gt3mr0PfS9YLOEFDCQrw7vSGvVN6OhwkZbU9uvsrHPiqnYHR538-f3n4C_KdLc9JeRRB0VDy9kQM5e7vCguu90MDLPvC7p5F_0AouxA6w3GMgQiEfuKFkSdZv5Dw01i5bSW8l7qUasGNvBATXrs6pJS3rj4cvteD4k7w2U2kJOQQZ2ux52t3bN9dY6JrDGZ45jAajnbauPIc_eAKepjvdgYF5Dr5RV3DTtmZMr6hDP1skBK_SBlG5xzwx1KS0ZR4LCUdTUnGUgajKemNewI8SMlepiRnymCsluFoLdlYytloynAsZTSacjaWMh5NGY0O9ZfTp88ZX3NGtHX5tiuccFUTh-SBO4ze_HC5uceZYAljMYlfFhSzwYPJNJ3TNKYxn9rCKjl3F_H2Vt5ez5u2-lze-1935582Ws1ffcUujGnaOzYL_ZhN87kQcUTTBAdpEkRU4ngWxFkmAp7gNPbjZKp4IpWZwzkEbquHczpp_wdASK24zSrtjjO7ribDHFtNiznxCfFDPIMnHI48QQijMYsyP_Q5DaJJ4EswvvKcel6lN1M9bzVNmo2BSVUYa86T3JhiU0rZagH8vLF5pedbuBNo862atruat1v6D_0jM0I">