[Lldb-commits] [PATCH] D12968: Fix for lldb-mi crash in Listener code if -exec-abort MI command was invoked without getting process stopped
Kirill Lapshin via lldb-commits
lldb-commits at lists.llvm.org
Tue Sep 29 11:05:49 PDT 2015
KLapshin updated this revision to Diff 36005.
KLapshin added a comment.
I realized what m_events.empty check in Listener::FindNextEventInternal() method returned event collection is NOT empty - probably because list.empty() just compare begin != end pointers, but pointers may be absolutely invalid.
So, as another workaround - switch to m_events.size() == 0 check.
I know - this looks funny because list.size() has O(N) complexity - i.e. - linear and time consuming, but works in this case because it do real empty list check.
I consider latest diff at moment just as some hint.
Actually two threads may modify events collection - one associated with Process and another one with GDBProcess module.
Full log (process and events) below corresponding to m_events.empty replaced with m_events collection size checking:
0x7f9f3d535110 Listener::WaitForEventsInternal (timeout = { 0x0 }) for lldb.process.internal_state_listener
-exec-abort
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::HijackBroadcaster (listener("lldb.process.halt_listener")=0x7fff5ac24580)
Process::SetPrivateState (stopped)
0x7fff5ac24580 Listener::WaitForEventsInternal (timeout = { 0x7fff5ac244e0 }) for lldb.process.halt_listener
Process::SetPrivateState (stopped) stop_id = 16
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {0x7f9f39f16ff0 Event: broadcaster = 0x7f9f3d534fa0 (lldb.process.internal_state_broadcaster), type = 0x00000001, data = { process = 0x7f9f3d534e00 (pid = 258), state = stopped}}, unique =0) hijack = 0x7fff5ac24580
0x7fff5ac24580 Listener('lldb.process.halt_listener')::AddEvent (event_sp = {0x7f9f39f16ff0})
0x7f9f3d536660 Listener::WaitForEventsInternal (timeout = { 0x0 }) for lldb.process.gdb-remote.async-listener
0x7fff5ac24580 'lldb.process.halt_listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f16ff0
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::RestoreBroadcaster (about to pop listener("lldb.process.halt_listener")=0x7fff5ac24580)
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {0x7f9f39f16ff0 Event: broadcaster = 0x7f9f3d534fa0 (lldb.process.internal_state_broadcaster), type = 0x00000001, data = { process = 0x7f9f3d534e00 (pid = 258), state = stopped}}, unique =0) hijack = 0x0
0x7f9f3d535110 Listener('lldb.process.internal_state_listener')::AddEvent (event_sp = {0x7f9f39f16ff0})
0x7f9f3d535110 'lldb.process.internal_state_listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f16ff0
Process::StopForDestroyOrDetach() About to stop.
0x700000428840 Listener::StartListeningForEvents (broadcaster = 0x7f9f3d5356a0, mask = 0x00000020) acquired_mask = 0x00000020 for Communication::SyncronizeWithReadThread
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {0x7f9f39e16fa0 Event: broadcaster = 0x7f9f3d534fa0 (lldb.process.internal_state_broadcaster), type = 0x00000002, data = <NULL>}, unique =0) hijack = 0x0
0x7f9f3d535110 Listener('lldb.process.internal_state_listener')::AddEvent (event_sp = {0x7f9f39e16fa0})
Process::WaitForProcessToStop (timeout = 0x7fff5ac25b40)
Process::WaitForStateChangedEvents (timeout = 0x7fff5ac25b40, event_sp)...
0x7f9f3b0ed920 Listener::WaitForEventsInternal (timeout = { 0x7fff5ac25b40 }) for
0x7f9f3b0ed920 Listener::WaitForEventsInternal() unknown error for
Process::WaitForStateChangedEvents (timeout = 0x7fff5ac25b40, event_sp) => invalid
Process::StopForDestroyOrDetach() failed to stop, state is: invalid
0x7f9f3d535db8 Broadcaster("gdb-remote.client")::HijackBroadcaster (listener("lldb.NotifyHijacker")=0x109d0bfa8)
Process::ShouldBroadcastEvent (0x7f9f39f16ff0) stopped due to an interrupt, state: stopped
Process::ShouldBroadcastEvent (0x7f9f39f16ff0) => new state: stopped, last broadcast state: stopped - YES
Process::HandlePrivateEvent (pid = 258) broadcasting new state stopped (old state running) to public
0x7f9f3d534e38 Broadcaster("lldb.process")::BroadcastEvent (event_sp = {0x7f9f39f16ff0 Event: broadcaster = 0x7f9f3d534e38 (lldb.process), type = 0x00000001 (state-changed), data = { process = 0x7f9f3d534e00 (pid = 258), state = stopped}}, unique =0) hijack = 0x0
0x7f9f3a058278 Listener('lldb.Debugger')::AddEvent (event_sp = {0x7f9f39f16ff0})
Process::WaitForEventsPrivate (timeout = 0x0, event_sp)...
0x7f9f3d535110 Listener::WaitForEventsInternal (timeout = { 0x0 }) for lldb.process.internal_state_listener
0x7f9f3d535110 'lldb.process.internal_state_listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39e16fa0
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::HijackBroadcaster (listener("lldb.process.halt_listener")=0x700000428aa0)
0x700000428aa0 Listener::WaitForEventsInternal (timeout = { 0x700000428a00 }) for lldb.process.halt_listener
0x7f9f3a058278 'lldb.Debugger' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f16ff0
Process::SetPublicState (state = stopped, restarted = 0)
Process::SetPublicState (stopped) -- unlocking run lock
0x7f9f3d535db8 Broadcaster("gdb-remote.client")::RestoreBroadcaster (about to pop listener("lldb.NotifyHijacker")=0x109d0bfa8)
Process::SetExitStatus (status=9 (0x00000009), description="")
Process::SetPrivateState (exited)
Process::SetPrivateState (exited) stop_id = 17
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {0x7f9f39f0e470 Event: broadcaster = 0x7f9f3d534fa0 (lldb.process.internal_state_broadcaster), type = 0x00000001, data = { process = 0x7f9f3d534e00 (pid = 258), state = exited}}, unique =0) hijack = 0x700000428aa0
0x700000428aa0 Listener('lldb.process.halt_listener')::AddEvent (event_sp = {0x7f9f39f0e470})
0x700000428aa0 'lldb.process.halt_listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f0e470
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::RestoreBroadcaster (about to pop listener("lldb.process.halt_listener")=0x700000428aa0)
0x7f9f3d534fa0 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {0x7f9f39f0e470 Event: broadcaster = 0x7f9f3d534fa0 (lldb.process.internal_state_broadcaster), type = 0x00000001, data = { process = 0x7f9f3d534e00 (pid = 258), state = exited}}, unique =0) hijack = 0x0
0x7f9f3d535110 Listener('lldb.process.internal_state_listener')::AddEvent (event_sp = {0x7f9f39f0e470})
0x7f9f3d5365a8 Broadcaster("lldb.process.gdb-remote.async-broadcaster")::BroadcastEvent (event_sp = {0x7f9f3b026b80 Event: broadcaster = 0x7f9f3d5365a8 (lldb.process.gdb-remote.async-broadcaster), type = 0x00000002 (async thread should exit), data = <NULL>}, unique =0) hijack = 0x0
Process::WaitForEventsPrivate (timeout = 0x0, event_sp)...
0x7f9f3d535110 Listener::WaitForEventsInternal (timeout = { 0x0 }) for lldb.process.internal_state_listener
0x7f9f3d535110 'lldb.process.internal_state_listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f0e470
0x700000428840 Listener::StartListeningForEvents (broadcaster = 0x7f9f3d5356a0, mask = 0x00000020) acquired_mask = 0x00000020 for Communication::SyncronizeWithReadThread
Process::ShouldBroadcastEvent (0x7f9f39f0e470) => new state: exited, last broadcast state: exited - YES
Process::HandlePrivateEvent (pid = 258) broadcasting new state exited (old state stopped) to public
0x7f9f3d536660 Listener('lldb.process.gdb-remote.async-listener')::AddEvent (event_sp = {0x7f9f3b026b80})
0x7f9f3d534e38 Broadcaster("lldb.process")::BroadcastEvent (event_sp = {0x7f9f39f0e470 Event: broadcaster = 0x7f9f3d534e38 (lldb.process), type = 0x00000001 (state-changed), data = { process = 0x7f9f3d534e00 (pid = 258), state = exited}}, unique =0) hijack = 0x0
0x7f9f3a058278 Listener('lldb.Debugger')::AddEvent (event_sp = {0x7f9f39f0e470})
0x7f9f3d536660 'lldb.process.gdb-remote.async-listener' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f3b026b80
Went to stop the private state thread, but it was already invalid.
^done
(gdb)
=thread-exited,id="1",group-id="i1"
=thread-exited,id="2",group-id="i1"
=thread-exited,id="3",group-id="i1"
=thread-exited,id="4",group-id="i1"
=thread-exited,id="5",group-id="i1"
=thread-exited,id="6",group-id="i1"
=thread-exited,id="7",group-id="i1"
(gdb)
0x7f9f3a058278 'lldb.Debugger' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=0) event 0x7f9f39f0e470
0x7f9f3a058278 'lldb.Debugger' Listener::FindNextEventInternal(broadcaster=0x0, broadcaster_names=0x0[0], event_type_mask=0x00000000, remove=1) event 0x7f9f39f0e470
Process::SetPublicState (state = exited, restarted = 0)
(gdb)
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1",exit-code="0"
*stopped,reason="exited-normally"
(gdb)
Repository:
rL LLVM
http://reviews.llvm.org/D12968
Files:
source/Core/Listener.cpp
Index: source/Core/Listener.cpp
===================================================================
--- source/Core/Listener.cpp
+++ source/Core/Listener.cpp
@@ -281,7 +281,7 @@
Mutex::Locker lock(m_events_mutex);
- if (m_events.empty())
+ if (!m_events.size())
return false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12968.36005.patch
Type: text/x-patch
Size: 304 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150929/0cfb3008/attachment-0001.bin>
More information about the lldb-commits
mailing list