[Lldb-commits] [PATCH] D119548: [lldb] Fix race condition between lldb-vscode and stop hooks executor

Jim Ingham via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Feb 14 17:19:44 PST 2022


jingham added a comment.

In D119548#3321397 <https://reviews.llvm.org/D119548#3321397>, @ilya-nozhkin wrote:

> In D119548#3321357 <https://reviews.llvm.org/D119548#3321357>, @jingham wrote:
>
>> SBTarget.Launch calls Target::Launch.  That sets up a hijacker for the "stop at the first instruction" event regardless of the Sync mode.
>
> The problem that it sets up this hijacker too late. See this part of the log (lines starting with // are my comments):
>
>   // The process has been launched successfully, its internal hijacker is removed.
>    0x000002875FCB1AE0 Broadcaster("lldb.process")::RestoreBroadcaster (about to pop listener("LaunchEventHijack")=0x000002875FFCF890)
>    Process::SetPublicState (state = stopped, restarted = 0)
>    Process::SetPublicState (stopped) -- unlocking run lock
>    Process::lldb_private::Process::StartPrivateStateThread() starting private state thread
>   
>   // Some internal magic happens inside the private state thread.
>    Process::lldb_private::Process::ControlPrivateStateThread (signal = 4)
>    Sending control event of type: 4.
>    0000028760372F90 Broadcaster("lldb.process.internal_state_control_broadcaster")::BroadcastEvent (event_sp = {0000028760571460 Event: broadcaster = 000002876047C4C0 (lldb.process.internal_state_control_broadcaster), type = 0x00000004 (control-resume), data = {Generic Event Data}}, unique =0) hijack = 0000000000000000
>    000002875FFD00D0 Listener('lldb.process.internal_state_listener')::AddEvent (event_sp = {0000028760571460})
>    Process::lldb_private::Process::RunPrivateStateThread (arg = 000002876047C350, pid = 9944) thread starting...
>    timeout = <infinite>, event_sp)...
>    this = 0x000002875FFD00D0, timeout = <infinite> for lldb.process.internal_state_listener
>    000002875FFD00D0 'lldb.process.internal_state_listener' Listener::FindNextEventInternal(broadcaster=000002876047C4C0, broadcaster_names=0000000000000000[0], event_type_mask=0x00000000, remove=1) event 0000028760571460
>    Process::lldb_private::Process::RunPrivateStateThread (arg = 000002876047C350, pid = 9944) got a control event: 4
>    000002875FFCF5D0 Listener::StartListeningForEvents (broadcaster = 000002876047C9C8, mask = 0x00000020) acquired_mask = 0x00000020 for Communication::SyncronizeWithReadThread
>    timeout = <infinite>, event_sp)...
>    this = 0x000002875FFD00D0, timeout = <infinite> for lldb.process.internal_state_listener
>    Process::ShouldBroadcastEvent (00000287604D4CB0) => new state: stopped, last broadcast state: stopped - YES
>    Process::lldb_private::Process::HandlePrivateEvent (pid = 9944) broadcasting new state stopped (old state stopped) to public
>   
>   // Process broadcasts the stop event.
>    000002875FCB1AE0 Broadcaster("lldb.process")::BroadcastEvent (event_sp = {00000287604D4CB0 Event: broadcaster = 000002876047C378 (lldb.process), type = 0x00000001 (state-changed), data = { process = 000002876047C350 (pid = 9944), state = stopped}}, unique =0) hijack = 0000000000000000
>   
>   // It is catched by "lldb.Debugger"!
>    000002875DB0BD40 Listener('lldb.Debugger')::AddEvent (event_sp = {00000287604D4CB0})
>   
>   // And only now the target adds its hijacking listener!
>    0x000002875FCB1AE0 Broadcaster("lldb.process")::HijackBroadcaster (listener("lldb.Target.Launch.hijack")=0x000002875FFCFE10)

That can't be it.  Target::Launch consumes the "stop at entry" event when it calls WaitForProcessToStop.  And then we set the Resume hijacker before we resume the process, so there weren't any other stop events around at that point.

It's also odd that we choose to broadcast a stop event when the state is stopped.  We don't usually broadcast duplicate events.  Somewhere we must be being helpful and sending out a priming event when the private state thread gets resumed.  But I couldn't find where we were doing that on a quick pass.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D119548/new/

https://reviews.llvm.org/D119548



More information about the lldb-commits mailing list