Added logging when API calls try to do something that shouldn't be done when the process is stopped by having logging calls that end with "error: process is running".
Also test for the process to be stopped when many SBValue API calls are made to make sure it is safe to evaluate values, children of values and much more.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@154160 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBThread.cpp b/source/API/SBThread.cpp
index 510f742..8110967 100644
--- a/source/API/SBThread.cpp
+++ b/source/API/SBThread.cpp
@@ -107,6 +107,11 @@
if (stop_info_sp)
reason = stop_info_sp->GetStopReason();
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetStopReason() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (log)
@@ -161,6 +166,12 @@
}
}
}
+ else
+ {
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ if (log)
+ log->Printf ("SBThread(%p)::GetStopReasonDataCount() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
return 0;
}
@@ -227,6 +238,12 @@
}
}
}
+ else
+ {
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ if (log)
+ log->Printf ("SBThread(%p)::GetStopReasonDataAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
return 0;
}
@@ -332,6 +349,12 @@
}
}
}
+ else
+ {
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ if (log)
+ log->Printf ("SBThread(%p)::GetStopDescription() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (dst)
*dst = 0;
@@ -341,6 +364,7 @@
SBValue
SBThread::GetStopReturnValue ()
{
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
ValueObjectSP return_valobj_sp;
ExecutionContext exe_ctx (m_opaque_sp.get());
if (exe_ctx.HasThreadScope())
@@ -355,9 +379,13 @@
return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp);
}
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetStopReturnValue() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (log)
log->Printf ("SBThread(%p)::GetStopReturnValue () => %s", exe_ctx.GetThreadPtr(),
return_valobj_sp.get()
@@ -395,6 +423,7 @@
const char *
SBThread::GetName () const
{
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
const char *name = NULL;
ExecutionContext exe_ctx (m_opaque_sp.get());
if (exe_ctx.HasThreadScope())
@@ -405,9 +434,13 @@
Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
name = exe_ctx.GetThreadPtr()->GetName();
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetName() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (log)
log->Printf ("SBThread(%p)::GetName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
@@ -419,6 +452,7 @@
{
const char *name = NULL;
ExecutionContext exe_ctx (m_opaque_sp.get());
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (exe_ctx.HasThreadScope())
{
Process::StopLocker stop_locker;
@@ -427,9 +461,13 @@
Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
name = exe_ctx.GetThreadPtr()->GetQueueName();
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetQueueName() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (log)
log->Printf ("SBThread(%p)::GetQueueName () => %s", exe_ctx.GetThreadPtr(), name ? name : "NULL");
@@ -846,25 +884,51 @@
bool
SBThread::Suspend()
{
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
ExecutionContext exe_ctx (m_opaque_sp.get());
+ bool result = false;
if (exe_ctx.HasThreadScope())
{
- exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
- return true;
+ Process::StopLocker stop_locker;
+ if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
+ {
+ exe_ctx.GetThreadPtr()->SetResumeState (eStateSuspended);
+ result = true;
+ }
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::Suspend() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
- return false;
+ if (log)
+ log->Printf ("SBThread(%p)::Suspend() => %i", exe_ctx.GetThreadPtr(), result);
+ return result;
}
bool
SBThread::Resume ()
{
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
ExecutionContext exe_ctx (m_opaque_sp.get());
+ bool result = false;
if (exe_ctx.HasThreadScope())
{
- exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
- return true;
+ Process::StopLocker stop_locker;
+ if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
+ {
+ exe_ctx.GetThreadPtr()->SetResumeState (eStateRunning);
+ result = true;
+ }
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::Resume() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
- return false;
+ if (log)
+ log->Printf ("SBThread(%p)::Resume() => %i", exe_ctx.GetThreadPtr(), result);
+ return result;
}
bool
@@ -916,6 +980,11 @@
Mutex::Locker api_locker (exe_ctx.GetTargetPtr()->GetAPIMutex());
num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount();
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetNumFrames() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (log)
@@ -941,6 +1010,11 @@
frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex (idx);
sb_frame.SetFrameSP (frame_sp);
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetFrameAtIndex() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (log)
@@ -971,6 +1045,11 @@
frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame ();
sb_frame.SetFrameSP (frame_sp);
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::GetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (log)
@@ -1006,6 +1085,11 @@
sb_frame.SetFrameSP (frame_sp);
}
}
+ else
+ {
+ if (log)
+ log->Printf ("SBThread(%p)::SetSelectedFrame() => error: process is running", exe_ctx.GetThreadPtr());
+ }
}
if (log)