forked from OSchip/llvm-project
Avoid a race condition when loading core files where the process might still be handling the eStateStopped event we post to the private state thread causing us to return from SBTarget::LoadCore() before the process is ready to have API calls used on it.
This fixes a crasher that could happen when loading core files from scripts. llvm-svn: 230060
This commit is contained in:
parent
9ecaa174d6
commit
35824e36f5
|
@ -3163,6 +3163,9 @@ Process::LoadCore ()
|
|||
Error error = DoLoadCore();
|
||||
if (error.Success())
|
||||
{
|
||||
Listener listener ("lldb.process.load_core_listener");
|
||||
HijackPrivateProcessEvents(&listener);
|
||||
|
||||
if (PrivateStateThreadIsValid ())
|
||||
ResumePrivateStateThread ();
|
||||
else
|
||||
|
@ -3184,6 +3187,19 @@ Process::LoadCore ()
|
|||
// state.
|
||||
SetPrivateState (eStateStopped);
|
||||
|
||||
// Wait indefinitely for a stopped event since we just posted one above...
|
||||
lldb::EventSP event_sp;
|
||||
listener.WaitForEvent (NULL, event_sp);
|
||||
StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
|
||||
|
||||
if (!StateIsStoppedState (state, false))
|
||||
{
|
||||
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
|
||||
if (log)
|
||||
log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
|
||||
error.SetErrorString ("Did not get stopped event after loading the core file.");
|
||||
}
|
||||
RestorePrivateProcessEvents ();
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue