[Lldb-commits] [lldb] r356643 - [Reproducers] Properly handle QEnvironment packets

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Thu Mar 21 01:32:56 PDT 2019


On 21/03/2019 05:08, Jonas Devlieghere via lldb-commits wrote:
> Author: jdevlieghere
> Date: Wed Mar 20 21:08:31 2019
> New Revision: 356643
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=356643&view=rev
> Log:
> [Reproducers] Properly handle QEnvironment packets
> 
> On Linux, a QEnvironment packet is sent for every environment variable.
> This breaks replay when the number of environment variables is different
> then during capture. The solution is to always reply with OK.
> 
> Modified:
>      lldb/trunk/lit/Reproducer/TestGDBRemoteRepro.test
>      lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp
> 
> Modified: lldb/trunk/lit/Reproducer/TestGDBRemoteRepro.test
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Reproducer/TestGDBRemoteRepro.test?rev=356643&r1=356642&r2=356643&view=diff
> ==============================================================================
> --- lldb/trunk/lit/Reproducer/TestGDBRemoteRepro.test (original)
> +++ lldb/trunk/lit/Reproducer/TestGDBRemoteRepro.test Wed Mar 20 21:08:31 2019
> @@ -9,7 +9,7 @@
>   # RUN: rm -rf %t.repro
>   # RUN: %clang %S/Inputs/simple.c -g -o %t.out
>   # RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE
> -# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY
> +# RUN: env FOO=BAR %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY
>   
>   # CHECK: Breakpoint 1
>   # CHECK: Process {{.*}} stopped
> 
> Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp?rev=356643&r1=356642&r2=356643&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp (original)
> +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationReplayServer.cpp Wed Mar 20 21:08:31 2019
> @@ -107,6 +107,13 @@ GDBRemoteCommunicationReplayServer::GetP
>       m_send_acks = false;
>     }
>   
> +  // A QEnvironment packet is sent for every environment variable. If the
> +  // number of environment variables is different during replay, the replies
> +  // become out of sync.
> +  if (packet.GetStringRef().find("QEnvironment") == 0) {
> +    return SendRawPacketNoLock("$OK#9a", true);
> +  }
> +
>     Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
>     while (!m_packet_history.empty()) {
>       // Pop last packet from the history.
> @@ -122,6 +129,14 @@ GDBRemoteCommunicationReplayServer::GetP
>                    "GDBRemoteCommunicationReplayServer actual packet: '{}'\n",
>                    packet.GetStringRef());
>         }
> +
> +      // Ignore QEnvironment packets as they're handled earlier.
> +      if (entry.packet.data.find("QEnvironment") == 1) {
> +        assert(m_packet_history.back().type ==
> +               GDBRemoteCommunicationHistory::ePacketTypeRecv);
> +        m_packet_history.pop_back();
> +      }
> +
>         continue;
>       }
>   
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> 

It sounds like we should have an "environment provider" which captures 
and reinstates the environment during record and replay respectively.


More information about the lldb-commits mailing list