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

    <tr>
        <th>Summary</th>
        <td>
            [lldb, gdb-remote] Bug in SendContinuePacketAndWaitForResponse (with Patch/Fix proposal)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          mf-RDP
      </td>
    </tr>
</table>

<pre>
    Hi all,

I think I discovered an issue in the async thread for gdb remote.
When stepping with high speed (max keyboard rate -> 30 'step' / sec) through a multisthreaded program, it appears that the async thread that calls SendContinuePacketAndWaitForResponse sometimes, in very rare occurrences receives not the T05 (stopreply) packet but the normal response for another query packet that is sent (by the other thread). This will of course result in a connection drop.

Below is an example log output.

I tried to fix this, please see attached code. However, this fix is not practically applicable I think, as it will drop packet bytes if it receives accidentially a normal response but should receive a T05 packet. However, it solves the problem.

Unfortunately, I am unsure what the root cause of this can be. As far as I can see the threads shall lock the underlying network connection. 

Many Thanks
S.

[LOG]

 Fetching extended information for thread 0001
 <  37> send packet: $jThreadExtendedInfo:{"thread":1}]#35
 < 749> read packet: $[{"tid":1,"metype":0,"mecount":0,"medata":[],"name":"Main Thread","qname":"default","qkind":"concurrent","reason":"breakpoint","qaddr":0,"registers":["0","79FF0100C0000000","1","F7FFFFFFBF000000","2","F6FFFFFFBF000000","3","BEFA0100C0000000"],"memory":[]}],{"tid":2,"metype":0,"mecount":0,"medata":[],"name":"Worker Thread","qname":"default","qkind":"concurrent","reason":"breakpoint","qaddr":0,"registers":["0","B2A30000C0000000","1","00000000C0000000","2","FFFFFFFFBF000000","3",null],"memory":[]}],{"tid":3,"metype":0,"mecount":0,"medata":[],"name":"Worker Thread","qname":"default","qkind":"concurrent","reason":"breakpoint","qaddr":0,"registers":["0","B2A30000C0000000","1","00000000C0000000","2","FFFFFFFFBF000000","3",null],"memory":[]}]]#35
 <  20> send packet: $qSWasmCallStack2#00
 < 935> read packet: ${"trace_messages":[{"message":""}],{"message":"call: _start[] returns[]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}],{"message":"call: __main_void[] returns[int32]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}],{"message":"call: __main_argc_argv[int32=[1] int32=[89104]] returns[int32]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}],{"message":"call: main[int32=[0] int32=[0]] returns[int32]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}],{"message":"call: _Z18debugger_terminatev[] returns[]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}],{"message":"call: _Z11printcolorsv[] returns[]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":"[truncated]"}]]}]#e7
 <  19> send packet: $p2;thread:0002;#8c
 <  25> read packet: $C00000A3B2,C000000000#3a
 Fetching extended information for thread 0002
 <  37> send packet: $jThreadExtendedInfo:{"thread":2}]#36
 < 20> read packet: $FFFFFFFFBF000000#d8
 <  20> send packet: $qSWasmCallStack3#01
 < 209> read packet: ${"trace_messages":[{"message":""}],{"message":"call: _Z14infiniteloop_APv[int32=[3366064]] returns[int32]"}],{"message":"stack_depth: 0"}],{"message":"call_state: state_memorysafe_bit"}],{"message":""}]]}]#bb
 <  19> send packet: $p2;thread:0003;#8d
 <  25> read packet: $C00000A3B2,C000000000#3a
 Fetching extended information for thread 0003
 <  37> send packet: $jThreadExtendedInfo:{"thread":3}]#37
 <  20> read packet: $FFFFFFFFBF000000#d8
 <  17> send packet: $xc00001ff6e,b#c1
 < 206> read packet: ${"trace_messages":[{"message":""}],{"message":"call: _Z14infiniteloop_APv[int32=[3456176]] returns[int32]"}],{"message":"stack_depth: 0"}],{"message":"call_state: none_or_executing"}],{"message":""}]]}]#84
 Check if need to update ignored signals
 Resuming thread: 0001 with state: running.
 Resuming thread: 0002 with state: suspended.
 Resuming thread: 0003 with state: suspended.
 ProcessGDBRemote::Resume()
 ProcessGDBRemote::lldb_private::process_gdb_remote::ProcessGDBRemote::AsyncThread(pid = 2) Got an event of type: 1...
 ProcessGDBRemote::lldb_private::process_gdb_remote::ProcessGDBRemote::AsyncThread(pid = 2) got eBroadcastBitAsyncContinue: vCont;c:1
 GDBRemoteClientBase::ContinueLock::lldb_private::process_gdb_remote::GDBRemoteClientBase::ContinueLock::lock() resuming with vCont;c:1
 <  13> send packet: $vCont;c:1#13
 <  15> read packet: $0b0340200e210f411c2116#40
 GDBRemoteClientBase::lldb_private::process_gdb_remote::GDBRemoteClientBase::SendContinuePacketAndWaitForResponse () got packet:  @ !A!        
 GDBRemoteClientBase::lldb_private::process_gdb_remote::GDBRemoteClientBase::SendContinuePacketAndWaitForResponse () unrecognized async packet
 ProcessGDBRemote::lldb_private::process_gdb_remote::ProcessGDBRemote::AsyncThread(pid = 2) thread exiting...


[gdbremote_diff.txt](https://github.com/llvm/llvm-project/files/10279477/gdbremote_diff.txt)

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWVtv27jy_zTMy6AGRfqmhzzYTt0tsIt_0faPAn0xKHIkcU2RKkk58fn0B5Rsx06a9IIu2i2OETgyOff5cUYkRQi6sojXZLIkk5sr0cXa-eumfPH25s1V4dT--g8NwhjCVoTeELoYvl9DrLXdwmtQOki3Q48KhAUdQoegLcQaQYS9lRBrj0JB6TxUqgCPjYs4GsR8qNFCiNi22lZwq2MNta5qCC2iAsLmjbiDLe4LJ7wCLyLCC8JfAqdA2CwxEjYDwtYQUBKWJ2Wuq2oQ0HQm6jAoRwWtd5UXDWEr0BFE26LwAWIt4mNT-1EpjAnwDq1aORu17fCNkFuMC6s-CB3Xzr_F0DobEIJrMOoGQy_dwg79HrzwCE7Kznu0EgN4lKh3GMC6Qed7Okkuhuhaj63ZJ_vbXgcU3UBinW-EAX_UlIIorIs1evjUJTUHht5kHSCgjUlose_5B8rBLcLyEbyvdYBbbQy4EqTrfMAkvTMxGS5AOmtRRu0sKO_a0XnOl2jcbVIiLOCdaFqDYFwFrottF0cP4OE1KogOSn2XsNLHpjUoUrwQQcQoZI0KpFM4gj_cLe7QJ6JE3HPpIVStFzLqlI59ypvRUhQG4YDAxCFCymnvVTL6FMR9xAC6TJOn4AsptUIb9SDvUYRT5EPtOqOOPCD6TA1CLyzVEYIzSWqKdetdYbC5iMP_29L52FkRMeV3Ba9BNNDZ0HmE2yP4vHMJb13AlJXefyksFDiCRYBS-OTh634shS6xDCkNEGphDBgnt_1wZxV6s0-LyWK8dX57ltERnJv2l7B7eF8Luw3DwLsLy8lk-ef_vSKTm_NBWGOUdZKOdxFtWlc6ediIHjEJnYclRCnNDjyErwD4LC3bgFYdAkn4Aggb__2-p395EPfalo7wBZktCWNH2DLCFxmZ3SRjGOeTM7mzcZ7k9iov5KZyNgjRJwlsRRhrMO5bHIbocUi6zsYHY0pEMQwNpXEYt6I5MBPG_hLawvuTlT3BpwsKhaXoTLyf3WqrTrPS2aE83BN4FMHZE0XhUWxbp88oPgml_IWtHisdIvpwby5j9MQwy9drmlG6osPnNJGdntazdf9Zrh-QsHuS6RMk_PS0fLlePFR0jFuDjfP7i3geErp6kCf24_P0wfkt-l8_U0u24Clwz2TqMPOY5CxT6-czZTtjviMv_H95-RXy8rgGAqOfr62f3n0QoVkJY95FIbeMME7pGWPOJ08UzyHzXkjcNBiCqPAsMv3kYfgU5vR3CZyHFKmBJ_mbEIWPg0_gMXbehiNCviQjJD82CttYJ1H067QmjRETg3UWN85v8A5lF7WtvizgGxzbNELbzc5p9cg7bSNnv42Lwlcyfe1OnvEbMllmyeez3_M8o-MBs79fKFIgLt2nD9ynv6vrm4_ZXGHRVRX6TUTf6PR-u_sdl_THLGu9tlE643z4F7k4WUbfWSkiqgsb7_s7x9l5E8nyzzeRlhG-PLyJ8wWlNP0mjM_lRQt6opMM7XDBl6nBHXtjan2ci-_YUrAfuaVg91uK6ZncoZs-duVx--Zq_h1tmKc2nF0ofGoP84-24Y_ZWNtSWx3RONduFm8elHPOp1M6_ZkFvH_YDK9CQZS4KXT8luV9Bvai-C6w8wPY1U8AO_-RYOf3YJ89Bu13oD17wqA7mcizspwiYauCMC4vwT79NcE-nkyz2fTf2rLPkD4fH8K9qlFuQZdgcTiJ61olIoKurPOoIOjKCnM4_IG3GLomIfME__4MZziTPRnpO2u1rUbPMrEHTKELbY_O59n4l9jeeCcxhFc3y7f9GXIKAl_0wpCwOWH5s4TGqGLTer0Tx5F2oNtUqtj4M8rP8y_C3srjXnXeagWE3wAjLIdXLvaHoju0sT_CS1tkvoBsNHre-H_QpspFwKV3QkkR4lLHnvZ4lp2s26UfhC9lfzo2mHmSvzIabVyKcNB0ZPzTye232v4tQtNTn8v-WLo5XQt8ztihEPHPF6JLBsazi3qaPVHDaUH5mDJKkWW0HGeZZFk2JYyP6Zci9APi8VW3DYfwpPyemU6XhHIypkDoS8IyQtcLkq3SUzaFw-cX86CzHqWrrP4PqsMFzMGhn7RkDr0X73Sqv6e1--BYvFLFoGWjdFmO4l3sC--8jrENfWFeE7audKy7YiRdQ9jamN3x34vWu79RRsLWpTapx60zymb5eDZLXI9lH6valbrmKue5uMLrbDrLpmPK8vyqvp6Wk-m0zKfTopSTYooTNWETNh2XBZfjPBdX-ppRxjKWkMwzno_y-Zjm8xkdZ8UkK8cZGVNshDajZODI-eqqv8a7nuTTcXZlRIEmXA-HYhZvhzu-fpNxc-Wve6eKrgpkTI0OMdxLiTqa_mYx5YywFVSqeHHI0OQGll0F2n7dFRth874MvBFR1oSt1_oOWu9aF4QhLL_qvLn-5gT0jqQM9I7-NwAA___OV3mC">