diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h index 6369b5bc32a2..1554b08c0fd0 100644 --- a/lldb/include/lldb/Target/Thread.h +++ b/lldb/include/lldb/Target/Thread.h @@ -20,9 +20,6 @@ #define LLDB_THREAD_MAX_STOP_EXC_DATA 8 -// I forward declare these here so I don't have to #include ThreadPlan, so in turn I -// can use Thread.h in ThreadPlan.h. - namespace lldb_private { class ThreadInstanceSettings : public InstanceSettings @@ -64,6 +61,14 @@ public: static const ConstString & StepAvoidRegexpVarName (); + + bool + GetTraceEnabledState() + { + return m_trace_enabled; + } + static const ConstString & + GetTraceThreadVarName (); protected: @@ -77,6 +82,7 @@ protected: private: std::auto_ptr m_avoid_regexp_ap; + bool m_trace_enabled; }; class Thread : @@ -590,6 +596,12 @@ public: void DumpThreadPlans (Stream *s) const; + void + EnableTracer (bool value, bool single_step); + + void + SetTracer (lldb::ThreadPlanTracerSP &tracer_sp); + //------------------------------------------------------------------ /// The regular expression returned determines symbols that this /// thread won't stop in during "step-in" operations. diff --git a/lldb/include/lldb/Target/ThreadPlan.h b/lldb/include/lldb/Target/ThreadPlan.h index d3135aef61c9..a0ae0e605e7a 100644 --- a/lldb/include/lldb/Target/ThreadPlan.h +++ b/lldb/include/lldb/Target/ThreadPlan.h @@ -19,6 +19,8 @@ #include "lldb/Core/UserID.h" #include "lldb/Host/Mutex.h" #include "lldb/Target/Thread.h" +#include "lldb/Target/ThreadPlanTracer.h" +#include "lldb/Target/StopInfo.h" namespace lldb_private { @@ -155,7 +157,7 @@ namespace lldb_private { // //------------------------------------------------------------------ -class ThreadPlan: +class ThreadPlan : public UserID { public: @@ -247,10 +249,19 @@ public: virtual bool PlanExplainsStop () = 0; + + bool + TracerExplainsStop () + { + if (!m_tracer_sp) + return false; + else + return m_tracer_sp->TracerExplainsStop(); + } - virtual lldb::StateType - RunState () = 0; + lldb::StateType + RunState (); virtual bool ShouldStop (Event *event_ptr) = 0; @@ -325,6 +336,25 @@ public: void SetPlanComplete (); + + lldb::ThreadPlanTracerSP & + GetThreadPlanTracer() + { + return m_tracer_sp; + } + + void + SetThreadPlanTracer (lldb::ThreadPlanTracerSP new_tracer_sp) + { + m_tracer_sp = new_tracer_sp; + } + + void + DoTraceLog () + { + if (m_tracer_sp && m_tracer_sp->TracingEnabled()) + m_tracer_sp->Log(); + } protected: //------------------------------------------------------------------ @@ -352,6 +382,10 @@ protected: { m_thread.SetStopInfo (stop_reason_sp); } + + virtual lldb::StateType + GetPlanRunState () = 0; + Thread &m_thread; lldb::Vote m_stop_vote; @@ -369,6 +403,8 @@ private: bool m_plan_complete; bool m_plan_private; bool m_okay_to_discard; + + lldb::ThreadPlanTracerSP m_tracer_sp; private: DISALLOW_COPY_AND_ASSIGN(ThreadPlan); diff --git a/lldb/include/lldb/Target/ThreadPlanBase.h b/lldb/include/lldb/Target/ThreadPlanBase.h index 6a0dbfc405a0..dd2b8680c7f6 100644 --- a/lldb/include/lldb/Target/ThreadPlanBase.h +++ b/lldb/include/lldb/Target/ThreadPlanBase.h @@ -36,7 +36,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanCallFunction.h b/lldb/include/lldb/Target/ThreadPlanCallFunction.h index f0e8f2c8df43..14a2440101e9 100644 --- a/lldb/include/lldb/Target/ThreadPlanCallFunction.h +++ b/lldb/include/lldb/Target/ThreadPlanCallFunction.h @@ -58,7 +58,7 @@ public: SetStopOthers (bool new_value); virtual lldb::StateType - RunState (); + GetPlanRunState (); virtual void DidPush (); diff --git a/lldb/include/lldb/Target/ThreadPlanRunToAddress.h b/lldb/include/lldb/Target/ThreadPlanRunToAddress.h index 5d287a5718c2..bb6f1bc647c8 100644 --- a/lldb/include/lldb/Target/ThreadPlanRunToAddress.h +++ b/lldb/include/lldb/Target/ThreadPlanRunToAddress.h @@ -59,7 +59,7 @@ public: SetStopOthers (bool new_value); virtual lldb::StateType - RunState (); + GetPlanRunState (); virtual bool WillStop (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepInstruction.h b/lldb/include/lldb/Target/ThreadPlanStepInstruction.h index 2157e84d8e9e..da7c777aa2bf 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepInstruction.h +++ b/lldb/include/lldb/Target/ThreadPlanStepInstruction.h @@ -30,7 +30,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepOut.h b/lldb/include/lldb/Target/ThreadPlanStepOut.h index fd74e7199c30..73f1c0e1420a 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepOut.h +++ b/lldb/include/lldb/Target/ThreadPlanStepOut.h @@ -30,7 +30,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillResume (lldb::StateType resume_state, bool current_plan); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepOverBreakpoint.h b/lldb/include/lldb/Target/ThreadPlanStepOverBreakpoint.h index 334fb27331a3..2e1c6c9b0913 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepOverBreakpoint.h +++ b/lldb/include/lldb/Target/ThreadPlanStepOverBreakpoint.h @@ -30,7 +30,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillResume (lldb::StateType resume_state, bool current_plan); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepRange.h b/lldb/include/lldb/Target/ThreadPlanStepRange.h index b9909ef665f2..d2b214aed427 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepRange.h +++ b/lldb/include/lldb/Target/ThreadPlanStepRange.h @@ -33,7 +33,7 @@ public: virtual bool ShouldStop (Event *event_ptr) = 0; virtual lldb::Vote ShouldReportStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepThrough.h b/lldb/include/lldb/Target/ThreadPlanStepThrough.h index 4763da719b85..247b6f29bed6 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepThrough.h +++ b/lldb/include/lldb/Target/ThreadPlanStepThrough.h @@ -29,7 +29,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillResume (lldb::StateType resume_state, bool current_plan); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanStepUntil.h b/lldb/include/lldb/Target/ThreadPlanStepUntil.h index 504fd2f8dfa8..5b4cae688ce5 100644 --- a/lldb/include/lldb/Target/ThreadPlanStepUntil.h +++ b/lldb/include/lldb/Target/ThreadPlanStepUntil.h @@ -30,7 +30,7 @@ public: virtual bool PlanExplainsStop (); virtual bool ShouldStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillResume (lldb::StateType resume_state, bool current_plan); virtual bool WillStop (); virtual bool MischiefManaged (); diff --git a/lldb/include/lldb/Target/ThreadPlanTestCondition.h b/lldb/include/lldb/Target/ThreadPlanTestCondition.h index cedc277f58f8..989d39fb43d3 100644 --- a/lldb/include/lldb/Target/ThreadPlanTestCondition.h +++ b/lldb/include/lldb/Target/ThreadPlanTestCondition.h @@ -41,7 +41,7 @@ public: virtual bool ShouldStop (Event *event_ptr); virtual lldb::Vote ShouldReportStop (Event *event_ptr); virtual bool StopOthers (); - virtual lldb::StateType RunState (); + virtual lldb::StateType GetPlanRunState (); virtual bool WillStop (); virtual bool MischiefManaged (); virtual void DidPush (); diff --git a/lldb/include/lldb/Target/ThreadPlanTracer.h b/lldb/include/lldb/Target/ThreadPlanTracer.h new file mode 100644 index 000000000000..6c44b8133f0e --- /dev/null +++ b/lldb/include/lldb/Target/ThreadPlanTracer.h @@ -0,0 +1,81 @@ +//===-- ThreadPlanTracer.h --------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ThreadPlanTracer_h_ +#define liblldb_ThreadPlanTracer_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-private.h" +#include "lldb/Target/Thread.h" + +namespace lldb_private { + +class ThreadPlanTracer +{ +friend class ThreadPlan; + +public: + ThreadPlanTracer (Thread &thread, lldb::StreamSP &stream_sp); + ThreadPlanTracer (Thread &thread); + + virtual ~ThreadPlanTracer() + { + } + + bool + EnableTracing(bool value) + { + bool old_value = m_enabled; + m_enabled = value; + return old_value; + } + + bool + TracingEnabled() + { + return m_enabled; + } + + bool + EnableSingleStep (bool value) + { + bool old_value = m_single_step; + m_single_step = value; + return old_value; + } + + bool + SingleStepEnabled () + { + return m_single_step; + } + +protected: + Thread &m_thread; + + Stream * + GetLogStream (); + + virtual void Log(); + +private: + bool + TracerExplainsStop (); + + bool m_single_step; + bool m_enabled; + lldb::StreamSP m_stream_sp; +}; + +} // namespace lldb_private + +#endif // liblldb_ThreadPlanTracer_h_ diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h index 73a98caa1bb7..0afc48433653 100644 --- a/lldb/include/lldb/lldb-enumerations.h +++ b/lldb/include/lldb/lldb-enumerations.h @@ -486,7 +486,7 @@ typedef enum AccessType typedef enum SettableVariableType { eSetVarTypeInt, - eSetVarTypeBool, + eSetVarTypeBoolean, eSetVarTypeString, eSetVarTypeArray, eSetVarTypeDictionary, diff --git a/lldb/include/lldb/lldb-forward-rtti.h b/lldb/include/lldb/lldb-forward-rtti.h index b7e7ee3a6de5..a00265048f78 100644 --- a/lldb/include/lldb/lldb-forward-rtti.h +++ b/lldb/include/lldb/lldb-forward-rtti.h @@ -61,6 +61,7 @@ namespace lldb { typedef SharedPtr::Type TargetSP; typedef SharedPtr::Type ThreadSP; typedef SharedPtr::Type ThreadPlanSP; + typedef SharedPtr::Type ThreadPlanTracerSP; typedef SharedPtr::Type TypeSP; typedef SharedPtr::Type FuncUnwindersSP; typedef SharedPtr::Type UserSettingsControllerSP; diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index fbed196c1aa5..bd3003fbe93d 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -135,6 +135,7 @@ class ThreadPlanStepOut; class ThreadPlanStepOverBreakpoint; class ThreadPlanStepRange; class ThreadPlanStepThrough; +class ThreadPlanTracer; class ThreadSpec; class TimeValue; class Type; diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index bafb52c84589..8372671fa5db 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -344,6 +344,8 @@ 4CB4436C124944B000C13DC2 /* ItaniumABILanguageRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB4436A124944B000C13DC2 /* ItaniumABILanguageRuntime.cpp */; }; 4CB443BE1249920C00C13DC2 /* CPPLanguageRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB443BC1249920C00C13DC2 /* CPPLanguageRuntime.cpp */; }; 4CB443F312499B5000C13DC2 /* ObjCLanguageRuntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CB443F212499B5000C13DC2 /* ObjCLanguageRuntime.cpp */; }; + 4CC2A149128C73ED001531C4 /* ThreadPlanTracer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CC2A148128C73ED001531C4 /* ThreadPlanTracer.cpp */; }; + 4CC2A14D128C7409001531C4 /* ThreadPlanTracer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC2A14C128C7409001531C4 /* ThreadPlanTracer.h */; }; 69A01E211236C5D400C660B5 /* Condition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A01E1B1236C5D400C660B5 /* Condition.cpp */; }; 69A01E221236C5D400C660B5 /* Host.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A01E1C1236C5D400C660B5 /* Host.cpp */; }; 69A01E241236C5D400C660B5 /* Mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A01E1E1236C5D400C660B5 /* Mutex.cpp */; }; @@ -993,6 +995,8 @@ 4CB443BC1249920C00C13DC2 /* CPPLanguageRuntime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CPPLanguageRuntime.cpp; path = source/Target/CPPLanguageRuntime.cpp; sourceTree = ""; }; 4CB443F212499B5000C13DC2 /* ObjCLanguageRuntime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjCLanguageRuntime.cpp; path = source/Target/ObjCLanguageRuntime.cpp; sourceTree = ""; }; 4CB443F612499B6E00C13DC2 /* ObjCLanguageRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ObjCLanguageRuntime.h; path = include/lldb/Target/ObjCLanguageRuntime.h; sourceTree = ""; }; + 4CC2A148128C73ED001531C4 /* ThreadPlanTracer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadPlanTracer.cpp; path = source/Target/ThreadPlanTracer.cpp; sourceTree = ""; }; + 4CC2A14C128C7409001531C4 /* ThreadPlanTracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadPlanTracer.h; path = include/lldb/Target/ThreadPlanTracer.h; sourceTree = ""; }; 4CEDAED311754F5E00E875A6 /* ThreadPlanStepUntil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThreadPlanStepUntil.h; path = include/lldb/Target/ThreadPlanStepUntil.h; sourceTree = ""; }; 4CEE62FA1145F2130064CF93 /* ProcessGDBRemote.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ProcessGDBRemote.cpp; path = "source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp"; sourceTree = ""; }; 4CEE62FB1145F2130064CF93 /* ProcessGDBRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProcessGDBRemote.h; path = "source/Plugins/Process/gdb-remote/ProcessGDBRemote.h"; sourceTree = ""; }; @@ -2073,6 +2077,8 @@ 2660D9FE11922A7F00958FBD /* ThreadPlanStepUntil.cpp */, 4C1AB23E1263E61100D0F04A /* ThreadPlanTestCondition.h */, 4C1AB23A1263E5F400D0F04A /* ThreadPlanTestCondition.cpp */, + 4CC2A14C128C7409001531C4 /* ThreadPlanTracer.h */, + 4CC2A148128C73ED001531C4 /* ThreadPlanTracer.cpp */, 4C08CDEB11C81F1E001610A8 /* ThreadSpec.h */, 4C08CDE711C81EF8001610A8 /* ThreadSpec.cpp */, 4C00986F11500B4300F316B0 /* UnixSignals.h */, @@ -2367,6 +2373,7 @@ 2635DA87127D0D0400675BC1 /* SharingPtr.h in Headers */, 4C61978D12823D4300FAFFCC /* AppleObjCRuntime.h in Headers */, 4C61978F12823D4300FAFFCC /* AppleObjCRuntimeV1.h in Headers */, + 4CC2A14D128C7409001531C4 /* ThreadPlanTracer.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2438,7 +2445,6 @@ isa = PBXProject; buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "lldb" */; compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, @@ -2869,6 +2875,7 @@ 4C1AB23B1263E5F400D0F04A /* ThreadPlanTestCondition.cpp in Sources */, 4C61978C12823D4300FAFFCC /* AppleObjCRuntime.cpp in Sources */, 4C61978E12823D4300FAFFCC /* AppleObjCRuntimeV1.cpp in Sources */, + 4CC2A149128C73ED001531C4 /* ThreadPlanTracer.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 5fcd20f56ee8..625969b28471 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -1681,7 +1681,7 @@ Debugger::SettingsController::instance_settings_table[] = { "script-lang", eSetVarTypeString, "python", NULL, false, false, "The script language to be used for evaluating user-written scripts." }, { "term-width", eSetVarTypeInt, "80" , NULL, false, false, "The maximum number of columns to use for displaying text." }, { "thread-format", eSetVarTypeString, DEFAULT_THREAD_FORMAT, NULL, false, false, "The default thread format string to use when displaying thread information." }, -{ "use-external-editor", eSetVarTypeBool, "false", NULL, false, false, "Whether to use an external editor or not." }, -{ "auto-confirm", eSetVarTypeBool, "false", NULL, false, false, "If true all confirmation prompts will receive their default reply." }, +{ "use-external-editor", eSetVarTypeBoolean, "false", NULL, false, false, "Whether to use an external editor or not." }, +{ "auto-confirm", eSetVarTypeBoolean, "false", NULL, false, false, "If true all confirmation prompts will receive their default reply." }, { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } }; diff --git a/lldb/source/Core/UserSettingsController.cpp b/lldb/source/Core/UserSettingsController.cpp index 4d807c36868f..8ec5551bc036 100644 --- a/lldb/source/Core/UserSettingsController.cpp +++ b/lldb/source/Core/UserSettingsController.cpp @@ -1010,7 +1010,7 @@ UserSettingsController::GetTypeString (lldb::SettableVariableType var_type) { case lldb::eSetVarTypeInt: return "int"; - case lldb::eSetVarTypeBool: + case lldb::eSetVarTypeBoolean: return "boolean"; case lldb::eSetVarTypeString: return "string"; @@ -1520,7 +1520,7 @@ UserSettingsController::CompleteSettingsValue (lldb::UserSettingsControllerSP ro if (entry == NULL) return 0; - if (entry->var_type == lldb::eSetVarTypeBool) + if (entry->var_type == lldb::eSetVarTypeBoolean) return UserSettingsController::BooleanMatches (partial_value, word_complete, matches); else if (entry->var_type == lldb::eSetVarTypeEnum) return UserSettingsController::EnumMatches (partial_value, entry->enum_values, word_complete, matches); diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp index 92b54991586d..b09f3d1e1ed0 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp @@ -94,7 +94,7 @@ AppleThreadPlanStepThroughObjCTrampoline::PlanExplainsStop () } lldb::StateType -AppleThreadPlanStepThroughObjCTrampoline::RunState () +AppleThreadPlanStepThroughObjCTrampoline::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.h index 207c88ddc807..512a8dbcd1ed 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.h +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.h @@ -50,7 +50,7 @@ public: virtual lldb::StateType - RunState (); + GetPlanRunState (); virtual bool ShouldStop (Event *event_ptr); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 3a09bcd43e3a..c9b5579be5d3 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2374,7 +2374,7 @@ Process::SettingsController::instance_settings_table[] = { "output-path", eSetVarTypeString, "/dev/stdout", NULL, false, false, "The file/path to be used by the executable program for writing its output." }, { "error-path", eSetVarTypeString, "/dev/stderr", NULL, false, false, "The file/path to be used by the executable program for writings its error messages." }, { "plugin", eSetVarTypeEnum, NULL , g_plugins, false, false, "The plugin to be used to run the process." }, - { "disable-aslr", eSetVarTypeBool, "true", NULL, false, false, "Disable Address Space Layout Randomization (ASLR)" }, + { "disable-aslr", eSetVarTypeBoolean, "true", NULL, false, false, "Disable Address Space Layout Randomization (ASLR)" }, { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } }; diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 4f7ff1d13e2f..80434cf33f29 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -227,6 +227,9 @@ Thread::ShouldStop (Event* event_ptr) DumpThreadPlans(&s); log->PutCString (s.GetData()); } + + // The top most plan always gets to do the trace log... + current_plan->DoTraceLog (); if (current_plan->PlanExplainsStop()) { @@ -268,6 +271,10 @@ Thread::ShouldStop (Event* event_ptr) if (over_ride_stop) should_stop = false; } + else if (current_plan->TracerExplainsStop()) + { + return false; + } else { // If the current plan doesn't explain the stop, then, find one that @@ -346,8 +353,11 @@ Thread::PushPlan (ThreadPlanSP &thread_plan_sp) { if (thread_plan_sp) { + // If the thread plan doesn't already have a tracer, give it its parent's tracer: + if (!thread_plan_sp->GetThreadPlanTracer()) + thread_plan_sp->SetThreadPlanTracer(m_plan_stack.back()->GetThreadPlanTracer()); m_plan_stack.push_back (thread_plan_sp); - + thread_plan_sp->DidPush(); LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); @@ -489,6 +499,29 @@ Thread::QueueThreadPlan (ThreadPlanSP &thread_plan_sp, bool abort_other_plans) PushPlan (thread_plan_sp); } + +void +Thread::EnableTracer (bool value, bool single_stepping) +{ + int stack_size = m_plan_stack.size(); + for (int i = 0; i < stack_size; i++) + { + if (m_plan_stack[i]->GetThreadPlanTracer()) + { + m_plan_stack[i]->GetThreadPlanTracer()->EnableTracing(value); + m_plan_stack[i]->GetThreadPlanTracer()->EnableSingleStep(single_stepping); + } + } +} + +void +Thread::SetTracer (lldb::ThreadPlanTracerSP &tracer_sp) +{ + int stack_size = m_plan_stack.size(); + for (int i = 0; i < stack_size; i++) + m_plan_stack[i]->SetThreadPlanTracer(tracer_sp); +} + void Thread::DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp) { @@ -936,197 +969,6 @@ Thread::UpdateInstanceName () Thread::GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), sstr.GetData()); } -//-------------------------------------------------------------- -// class Thread::ThreadSettingsController -//-------------------------------------------------------------- - -Thread::ThreadSettingsController::ThreadSettingsController () : - UserSettingsController ("thread", Process::GetSettingsController()) -{ - m_default_settings.reset (new ThreadInstanceSettings (*this, false, - InstanceSettings::GetDefaultName().AsCString())); -} - -Thread::ThreadSettingsController::~ThreadSettingsController () -{ -} - -lldb::InstanceSettingsSP -Thread::ThreadSettingsController::CreateInstanceSettings (const char *instance_name) -{ - ThreadInstanceSettings *new_settings = new ThreadInstanceSettings (*(Thread::GetSettingsController().get()), - false, instance_name); - lldb::InstanceSettingsSP new_settings_sp (new_settings); - return new_settings_sp; -} - -//-------------------------------------------------------------- -// class ThreadInstanceSettings -//-------------------------------------------------------------- - -ThreadInstanceSettings::ThreadInstanceSettings (UserSettingsController &owner, bool live_instance, const char *name) : - InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance), - m_avoid_regexp_ap () -{ - // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called - // until the vtables for ThreadInstanceSettings are properly set up, i.e. AFTER all the initializers. - // For this reason it has to be called here, rather than in the initializer or in the parent constructor. - // This is true for CreateInstanceName() too. - - if (GetInstanceName() == InstanceSettings::InvalidName()) - { - ChangeInstanceName (std::string (CreateInstanceName().AsCString())); - m_owner.RegisterInstanceSettings (this); - } - - if (live_instance) - { - const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); - CopyInstanceSettings (pending_settings,false); - //m_owner.RemovePendingSettings (m_instance_name); - } -} - -ThreadInstanceSettings::ThreadInstanceSettings (const ThreadInstanceSettings &rhs) : - InstanceSettings (*(Thread::GetSettingsController().get()), CreateInstanceName().AsCString()), - m_avoid_regexp_ap () -{ - if (m_instance_name != InstanceSettings::GetDefaultName()) - { - const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); - CopyInstanceSettings (pending_settings,false); - m_owner.RemovePendingSettings (m_instance_name); - } - if (rhs.m_avoid_regexp_ap.get() != NULL) - m_avoid_regexp_ap.reset(new RegularExpression(rhs.m_avoid_regexp_ap->GetText())); -} - -ThreadInstanceSettings::~ThreadInstanceSettings () -{ -} - -ThreadInstanceSettings& -ThreadInstanceSettings::operator= (const ThreadInstanceSettings &rhs) -{ - if (this != &rhs) - { - if (rhs.m_avoid_regexp_ap.get() != NULL) - m_avoid_regexp_ap.reset(new RegularExpression(rhs.m_avoid_regexp_ap->GetText())); - else - m_avoid_regexp_ap.reset(NULL); - } - - return *this; -} - - -void -ThreadInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, - const char *index_value, - const char *value, - const ConstString &instance_name, - const SettingEntry &entry, - lldb::VarSetOperationType op, - Error &err, - bool pending) -{ - if (var_name == StepAvoidRegexpVarName()) - { - std::string regexp_text; - if (m_avoid_regexp_ap.get() != NULL) - regexp_text.append (m_avoid_regexp_ap->GetText()); - UserSettingsController::UpdateStringVariable (op, regexp_text, value, err); - if (regexp_text.empty()) - m_avoid_regexp_ap.reset(); - else - { - m_avoid_regexp_ap.reset(new RegularExpression(regexp_text.c_str())); - - } - } -} - -void -ThreadInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, - bool pending) -{ - if (new_settings.get() == NULL) - return; - - ThreadInstanceSettings *new_process_settings = (ThreadInstanceSettings *) new_settings.get(); - if (new_process_settings->GetSymbolsToAvoidRegexp() != NULL) - m_avoid_regexp_ap.reset (new RegularExpression (new_process_settings->GetSymbolsToAvoidRegexp()->GetText())); - else - m_avoid_regexp_ap.reset (); -} - -bool -ThreadInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, - const ConstString &var_name, - StringList &value, - Error *err) -{ - if (var_name == StepAvoidRegexpVarName()) - { - if (m_avoid_regexp_ap.get() != NULL) - { - std::string regexp_text("\""); - regexp_text.append(m_avoid_regexp_ap->GetText()); - regexp_text.append ("\""); - value.AppendString (regexp_text.c_str()); - } - - } - else - { - if (err) - err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); - return false; - } - return true; -} - -const ConstString -ThreadInstanceSettings::CreateInstanceName () -{ - static int instance_count = 1; - StreamString sstr; - - sstr.Printf ("thread_%d", instance_count); - ++instance_count; - - const ConstString ret_val (sstr.GetData()); - return ret_val; -} - -const ConstString & -ThreadInstanceSettings::StepAvoidRegexpVarName () -{ - static ConstString run_args_var_name ("step-avoid-regexp"); - - return run_args_var_name; -} - -//-------------------------------------------------- -// ThreadSettingsController Variable Tables -//-------------------------------------------------- - -SettingEntry -Thread::ThreadSettingsController::global_settings_table[] = -{ - //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, - { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } -}; - - -SettingEntry -Thread::ThreadSettingsController::instance_settings_table[] = -{ - //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, - { "step-avoid-regexp", eSetVarTypeString, "", NULL, false, false, "A regular expression defining functions step-in won't stop in." }, - { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } -}; - lldb::StackFrameSP Thread::GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr) { @@ -1168,3 +1010,231 @@ Thread::RunModeAsCString (lldb::RunMode mode) snprintf(unknown_state_string, sizeof (unknown_state_string), "RunMode = %i", mode); return unknown_state_string; } + +#pragma mark "Thread::ThreadSettingsController" +//-------------------------------------------------------------- +// class Thread::ThreadSettingsController +//-------------------------------------------------------------- + +Thread::ThreadSettingsController::ThreadSettingsController () : + UserSettingsController ("thread", Process::GetSettingsController()) +{ + m_default_settings.reset (new ThreadInstanceSettings (*this, false, + InstanceSettings::GetDefaultName().AsCString())); +} + +Thread::ThreadSettingsController::~ThreadSettingsController () +{ +} + +lldb::InstanceSettingsSP +Thread::ThreadSettingsController::CreateInstanceSettings (const char *instance_name) +{ + ThreadInstanceSettings *new_settings = new ThreadInstanceSettings (*(Thread::GetSettingsController().get()), + false, instance_name); + lldb::InstanceSettingsSP new_settings_sp (new_settings); + return new_settings_sp; +} + +#pragma mark "ThreadInstanceSettings" +//-------------------------------------------------------------- +// class ThreadInstanceSettings +//-------------------------------------------------------------- + +ThreadInstanceSettings::ThreadInstanceSettings (UserSettingsController &owner, bool live_instance, const char *name) : + InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance), + m_avoid_regexp_ap (), + m_trace_enabled (false) +{ + // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called + // until the vtables for ThreadInstanceSettings are properly set up, i.e. AFTER all the initializers. + // For this reason it has to be called here, rather than in the initializer or in the parent constructor. + // This is true for CreateInstanceName() too. + + if (GetInstanceName() == InstanceSettings::InvalidName()) + { + ChangeInstanceName (std::string (CreateInstanceName().AsCString())); + m_owner.RegisterInstanceSettings (this); + } + + if (live_instance) + { + const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); + CopyInstanceSettings (pending_settings,false); + //m_owner.RemovePendingSettings (m_instance_name); + } +} + +ThreadInstanceSettings::ThreadInstanceSettings (const ThreadInstanceSettings &rhs) : + InstanceSettings (*(Thread::GetSettingsController().get()), CreateInstanceName().AsCString()), + m_avoid_regexp_ap (), + m_trace_enabled (rhs.m_trace_enabled) +{ + if (m_instance_name != InstanceSettings::GetDefaultName()) + { + const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); + CopyInstanceSettings (pending_settings,false); + m_owner.RemovePendingSettings (m_instance_name); + } + if (rhs.m_avoid_regexp_ap.get() != NULL) + m_avoid_regexp_ap.reset(new RegularExpression(rhs.m_avoid_regexp_ap->GetText())); +} + +ThreadInstanceSettings::~ThreadInstanceSettings () +{ +} + +ThreadInstanceSettings& +ThreadInstanceSettings::operator= (const ThreadInstanceSettings &rhs) +{ + if (this != &rhs) + { + if (rhs.m_avoid_regexp_ap.get() != NULL) + m_avoid_regexp_ap.reset(new RegularExpression(rhs.m_avoid_regexp_ap->GetText())); + else + m_avoid_regexp_ap.reset(NULL); + } + m_trace_enabled = rhs.m_trace_enabled; + return *this; +} + + +void +ThreadInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, + const char *index_value, + const char *value, + const ConstString &instance_name, + const SettingEntry &entry, + lldb::VarSetOperationType op, + Error &err, + bool pending) +{ + if (var_name == StepAvoidRegexpVarName()) + { + std::string regexp_text; + if (m_avoid_regexp_ap.get() != NULL) + regexp_text.append (m_avoid_regexp_ap->GetText()); + UserSettingsController::UpdateStringVariable (op, regexp_text, value, err); + if (regexp_text.empty()) + m_avoid_regexp_ap.reset(); + else + { + m_avoid_regexp_ap.reset(new RegularExpression(regexp_text.c_str())); + + } + } + else if (var_name == GetTraceThreadVarName()) + { + bool success; + bool result = Args::StringToBoolean(value, false, &success); + + if (success) + { + m_trace_enabled = result; + if (!pending) + { + Thread *myself = static_cast (this); + myself->EnableTracer(m_trace_enabled, true); + } + } + else + { + err.SetErrorStringWithFormat ("Bad value \"%s\" for trace-thread, should be Boolean.", value); + } + + } +} + +void +ThreadInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, + bool pending) +{ + if (new_settings.get() == NULL) + return; + + ThreadInstanceSettings *new_process_settings = (ThreadInstanceSettings *) new_settings.get(); + if (new_process_settings->GetSymbolsToAvoidRegexp() != NULL) + m_avoid_regexp_ap.reset (new RegularExpression (new_process_settings->GetSymbolsToAvoidRegexp()->GetText())); + else + m_avoid_regexp_ap.reset (); +} + +bool +ThreadInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, + const ConstString &var_name, + StringList &value, + Error *err) +{ + if (var_name == StepAvoidRegexpVarName()) + { + if (m_avoid_regexp_ap.get() != NULL) + { + std::string regexp_text("\""); + regexp_text.append(m_avoid_regexp_ap->GetText()); + regexp_text.append ("\""); + value.AppendString (regexp_text.c_str()); + } + + } + else if (var_name == GetTraceThreadVarName()) + { + value.AppendString(m_trace_enabled ? "true" : "false"); + } + else + { + if (err) + err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); + return false; + } + return true; +} + +const ConstString +ThreadInstanceSettings::CreateInstanceName () +{ + static int instance_count = 1; + StreamString sstr; + + sstr.Printf ("thread_%d", instance_count); + ++instance_count; + + const ConstString ret_val (sstr.GetData()); + return ret_val; +} + +const ConstString & +ThreadInstanceSettings::StepAvoidRegexpVarName () +{ + static ConstString step_avoid_var_name ("step-avoid-regexp"); + + return step_avoid_var_name; +} + +const ConstString & +ThreadInstanceSettings::GetTraceThreadVarName () +{ + static ConstString trace_thread_var_name ("trace-thread"); + + return trace_thread_var_name; +} + +//-------------------------------------------------- +// ThreadSettingsController Variable Tables +//-------------------------------------------------- + +SettingEntry +Thread::ThreadSettingsController::global_settings_table[] = +{ + //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, + { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } +}; + + +SettingEntry +Thread::ThreadSettingsController::instance_settings_table[] = +{ + //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, + { "step-avoid-regexp", eSetVarTypeString, "", NULL, false, false, "A regular expression defining functions step-in won't stop in." }, + { "trace-thread", eSetVarTypeBoolean, "false", NULL, false, false, "If true, this thread will single-step and log execution." }, + { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } +}; diff --git a/lldb/source/Target/ThreadPlan.cpp b/lldb/source/Target/ThreadPlan.cpp index 38cf7a49ea9f..4d2d54b6137d 100644 --- a/lldb/source/Target/ThreadPlan.cpp +++ b/lldb/source/Target/ThreadPlan.cpp @@ -13,10 +13,13 @@ // C++ Includes // Other libraries and framework includes // Project includes +#include "lldb/Core/Debugger.h" #include "lldb/Core/Log.h" #include "lldb/Core/State.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/Thread.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/Target.h" using namespace lldb; using namespace lldb_private; @@ -208,3 +211,11 @@ ThreadPlan::OkayToDiscard() return m_okay_to_discard; } +lldb::StateType +ThreadPlan::RunState () +{ + if (m_tracer_sp && m_tracer_sp->TracingEnabled() && m_tracer_sp->SingleStepEnabled()) + return eStateStepping; + else + return GetPlanRunState(); +} diff --git a/lldb/source/Target/ThreadPlanBase.cpp b/lldb/source/Target/ThreadPlanBase.cpp index 393a3ddeda55..55ef2f71551e 100644 --- a/lldb/source/Target/ThreadPlanBase.cpp +++ b/lldb/source/Target/ThreadPlanBase.cpp @@ -35,7 +35,10 @@ using namespace lldb_private; ThreadPlanBase::ThreadPlanBase (Thread &thread) : ThreadPlan(ThreadPlan::eKindBase, "base plan", thread, eVoteYes, eVoteNoOpinion) { - + // Set the tracer to a default tracer. + ThreadPlanTracerSP new_tracer_sp (new ThreadPlanTracer (m_thread)); + new_tracer_sp->EnableTracing (m_thread.GetTraceEnabledState()); + SetThreadPlanTracer(new_tracer_sp); } ThreadPlanBase::~ThreadPlanBase () @@ -58,7 +61,12 @@ ThreadPlanBase::ValidatePlan (Stream *error) bool ThreadPlanBase::PlanExplainsStop () { - return true; + // The base plan should defer to its tracer, since by default it + // always handles the stop. + if (TracerExplainsStop()) + return false; + else + return true; } bool @@ -153,7 +161,7 @@ ThreadPlanBase::StopOthers () } StateType -ThreadPlanBase::RunState () +ThreadPlanBase::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp index 95a7d0d80473..9e29256b119f 100644 --- a/lldb/source/Target/ThreadPlanCallFunction.cpp +++ b/lldb/source/Target/ThreadPlanCallFunction.cpp @@ -330,7 +330,7 @@ ThreadPlanCallFunction::SetStopOthers (bool new_value) } StateType -ThreadPlanCallFunction::RunState () +ThreadPlanCallFunction::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanRunToAddress.cpp b/lldb/source/Target/ThreadPlanRunToAddress.cpp index 66595857c6af..f8df04e20b94 100644 --- a/lldb/source/Target/ThreadPlanRunToAddress.cpp +++ b/lldb/source/Target/ThreadPlanRunToAddress.cpp @@ -201,7 +201,7 @@ ThreadPlanRunToAddress::SetStopOthers (bool new_value) } StateType -ThreadPlanRunToAddress::RunState () +ThreadPlanRunToAddress::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanStepInstruction.cpp b/lldb/source/Target/ThreadPlanStepInstruction.cpp index 142e7cc30b91..a3dc1a82bad5 100644 --- a/lldb/source/Target/ThreadPlanStepInstruction.cpp +++ b/lldb/source/Target/ThreadPlanStepInstruction.cpp @@ -162,7 +162,7 @@ ThreadPlanStepInstruction::StopOthers () } StateType -ThreadPlanStepInstruction::RunState () +ThreadPlanStepInstruction::GetPlanRunState () { return eStateStepping; } diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp index bbe16e53f656..690a43c74fb0 100644 --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/source/Target/ThreadPlanStepOut.cpp @@ -161,7 +161,7 @@ ThreadPlanStepOut::StopOthers () } StateType -ThreadPlanStepOut::RunState () +ThreadPlanStepOut::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp index 9dbe3cc43184..f55926f72e2b 100644 --- a/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp +++ b/lldb/source/Target/ThreadPlanStepOverBreakpoint.cpp @@ -77,7 +77,7 @@ ThreadPlanStepOverBreakpoint::StopOthers () } StateType -ThreadPlanStepOverBreakpoint::RunState () +ThreadPlanStepOverBreakpoint::GetPlanRunState () { return eStateStepping; } diff --git a/lldb/source/Target/ThreadPlanStepRange.cpp b/lldb/source/Target/ThreadPlanStepRange.cpp index 9551e0fdbab2..a1b958e5ca50 100644 --- a/lldb/source/Target/ThreadPlanStepRange.cpp +++ b/lldb/source/Target/ThreadPlanStepRange.cpp @@ -226,7 +226,7 @@ ThreadPlanStepRange::WillStop () } StateType -ThreadPlanStepRange::RunState () +ThreadPlanStepRange::GetPlanRunState () { return eStateStepping; } diff --git a/lldb/source/Target/ThreadPlanStepThrough.cpp b/lldb/source/Target/ThreadPlanStepThrough.cpp index 16e0b894b3b6..c7257a762f6e 100644 --- a/lldb/source/Target/ThreadPlanStepThrough.cpp +++ b/lldb/source/Target/ThreadPlanStepThrough.cpp @@ -82,7 +82,7 @@ ThreadPlanStepThrough::StopOthers () } StateType -ThreadPlanStepThrough::RunState () +ThreadPlanStepThrough::GetPlanRunState () { return eStateStepping; } diff --git a/lldb/source/Target/ThreadPlanStepUntil.cpp b/lldb/source/Target/ThreadPlanStepUntil.cpp index f02a63a5c0fd..8fca2342ac12 100644 --- a/lldb/source/Target/ThreadPlanStepUntil.cpp +++ b/lldb/source/Target/ThreadPlanStepUntil.cpp @@ -290,7 +290,7 @@ ThreadPlanStepUntil::StopOthers () } StateType -ThreadPlanStepUntil::RunState () +ThreadPlanStepUntil::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanTestCondition.cpp b/lldb/source/Target/ThreadPlanTestCondition.cpp index 888de0c70e4d..0087dfc920fd 100644 --- a/lldb/source/Target/ThreadPlanTestCondition.cpp +++ b/lldb/source/Target/ThreadPlanTestCondition.cpp @@ -168,7 +168,7 @@ ThreadPlanTestCondition::WillStop () } StateType -ThreadPlanTestCondition::RunState () +ThreadPlanTestCondition::GetPlanRunState () { return eStateRunning; } diff --git a/lldb/source/Target/ThreadPlanTracer.cpp b/lldb/source/Target/ThreadPlanTracer.cpp new file mode 100644 index 000000000000..632cfe68c31e --- /dev/null +++ b/lldb/source/Target/ThreadPlanTracer.cpp @@ -0,0 +1,77 @@ +//===-- ThreadPlan.cpp ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Target/ThreadPlan.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/Debugger.h" +#include "lldb/Core/Log.h" +#include "lldb/Core/State.h" +#include "lldb/Target/RegisterContext.h" +#include "lldb/Target/Thread.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/Target.h" + +using namespace lldb; +using namespace lldb_private; + +ThreadPlanTracer::ThreadPlanTracer (Thread &thread, lldb::StreamSP &stream_sp) : + m_single_step(true), + m_enabled (false), + m_thread (thread), + m_stream_sp (stream_sp) +{ +} + +ThreadPlanTracer::ThreadPlanTracer (Thread &thread) : + m_single_step(true), + m_enabled (false), + m_thread (thread), + m_stream_sp () +{ +} + +Stream * +ThreadPlanTracer::GetLogStream () +{ + + if (m_stream_sp.get()) + return m_stream_sp.get(); + else + return &(m_thread.GetProcess().GetTarget().GetDebugger().GetOutputStream()); +} + +void +ThreadPlanTracer::Log() +{ + SymbolContext sc; + bool show_frame_index = false; + bool show_fullpaths = false; + + m_thread.GetStackFrameAtIndex(0)->Dump (GetLogStream(), show_frame_index, show_fullpaths); + GetLogStream()->Printf("\n"); +} + +bool +ThreadPlanTracer::TracerExplainsStop () +{ + if (m_enabled && m_single_step) + { + lldb::StopInfoSP stop_info = m_thread.GetStopInfo(); + if (stop_info->GetStopReason() == eStopReasonTrace) + return true; + else + return false; + } + else + return false; +}