From 822e4e6c944997e824e2b5aeca6bf09ea2ed8ed2 Mon Sep 17 00:00:00 2001 From: yang-19970325 Date: Thu, 17 Aug 2023 16:35:27 +0800 Subject: [PATCH] Add new protocol for debugger Issue:#I7U0JW Signed-off-by: yang-19970325 Change-Id: Iac40552778f80dc247a979f59e81b4b1f7da5e9d --- tooling/agent/debugger_impl.cpp | 46 +++++++++++++++++++++++++++++++++ tooling/agent/debugger_impl.h | 6 +++++ tooling/base/pt_params.cpp | 42 ++++++++++++++++++++++++++++++ tooling/base/pt_params.h | 37 ++++++++++++++++++++++++++ 4 files changed, 131 insertions(+) diff --git a/tooling/agent/debugger_impl.cpp b/tooling/agent/debugger_impl.cpp index 843a7e27..5ea43f26 100644 --- a/tooling/agent/debugger_impl.cpp +++ b/tooling/agent/debugger_impl.cpp @@ -185,6 +185,14 @@ bool DebuggerImpl::CheckPauseOnException() void DebuggerImpl::NotifyPaused(std::optional location, PauseReason reason) { + if (skipAllPausess_) { + return; + } + + if (location.has_value() && !breakpointsState_) { + return; + } + if (reason == EXCEPTION && !CheckPauseOnException()) { return; } @@ -288,7 +296,9 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) { "resume", &DebuggerImpl::DispatcherImpl::Resume }, { "setAsyncCallStackDepth", &DebuggerImpl::DispatcherImpl::SetAsyncCallStackDepth }, { "setBreakpointByUrl", &DebuggerImpl::DispatcherImpl::SetBreakpointByUrl }, + { "setBreakpointsActive", &DebuggerImpl::DispatcherImpl::SetBreakpointsActive }, { "setPauseOnExceptions", &DebuggerImpl::DispatcherImpl::SetPauseOnExceptions }, + { "setSkipAllPauses", &DebuggerImpl::DispatcherImpl::SetSkipAllPauses }, { "stepInto", &DebuggerImpl::DispatcherImpl::StepInto }, { "stepOut", &DebuggerImpl::DispatcherImpl::StepOut }, { "stepOver", &DebuggerImpl::DispatcherImpl::StepOver }, @@ -423,6 +433,18 @@ void DebuggerImpl::DispatcherImpl::SetBreakpointByUrl(const DispatchRequest &req SendResponse(request, response, result); } +void DebuggerImpl::DispatcherImpl::SetBreakpointsActive(const DispatchRequest &request) +{ + std::unique_ptr params = SetBreakpointsActiveParams::Create(request.GetParams()); + if (params == nullptr) { + SendResponse(request, DispatchResponse::Fail("wrong params")); + return; + } + + DispatchResponse response = debugger_->SetBreakpointsActive(*params); + SendResponse(request, response); +} + void DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl(const DispatchRequest &request) { std::unique_ptr params; @@ -450,6 +472,18 @@ void DebuggerImpl::DispatcherImpl::SetPauseOnExceptions(const DispatchRequest &r SendResponse(request, response); } +void DebuggerImpl::DispatcherImpl::SetSkipAllPauses(const DispatchRequest &request) +{ + std::unique_ptr params = SetSkipAllPausesParams::Create(request.GetParams()); + if (params == nullptr) { + SendResponse(request, DispatchResponse::Fail("wrong params")); + return; + } + + DispatchResponse response = debugger_->SetSkipAllPauses(*params); + SendResponse(request, response); +} + void DebuggerImpl::DispatcherImpl::StepInto(const DispatchRequest &request) { std::unique_ptr params = StepIntoParams::Create(request.GetParams()); @@ -829,6 +863,12 @@ DispatchResponse DebuggerImpl::SetBreakpointByUrl(const SetBreakpointByUrlParams return DispatchResponse::Ok(); } +DispatchResponse DebuggerImpl::SetBreakpointsActive(const SetBreakpointsActiveParams ¶ms) +{ + breakpointsState_ = params.GetBreakpointsState(); + return DispatchResponse::Ok(); +} + DispatchResponse DebuggerImpl::GetPossibleAndSetBreakpointByUrl(const GetPossibleAndSetBreakpointParams ¶ms, std::vector> &outLocations) { @@ -917,6 +957,12 @@ DispatchResponse DebuggerImpl::SetPauseOnExceptions(const SetPauseOnExceptionsPa return DispatchResponse::Ok(); } +DispatchResponse DebuggerImpl::SetSkipAllPauses(const SetSkipAllPausesParams ¶ms) +{ + skipAllPausess_ = params.GetSkipAllPausesState(); + return DispatchResponse::Ok(); +} + DispatchResponse DebuggerImpl::StepInto([[maybe_unused]] const StepIntoParams ¶ms) { if (debuggerState_ != DebuggerState::PAUSED) { diff --git a/tooling/agent/debugger_impl.h b/tooling/agent/debugger_impl.h index 1c88b267..6b5755c2 100644 --- a/tooling/agent/debugger_impl.h +++ b/tooling/agent/debugger_impl.h @@ -59,9 +59,11 @@ public: DispatchResponse SetAsyncCallStackDepth(); DispatchResponse SetBreakpointByUrl(const SetBreakpointByUrlParams ¶ms, std::string *outId, std::vector> *outLocations); + DispatchResponse SetBreakpointsActive(const SetBreakpointsActiveParams ¶ms); DispatchResponse GetPossibleAndSetBreakpointByUrl(const GetPossibleAndSetBreakpointParams ¶ms, std::vector> &outLocations); DispatchResponse SetPauseOnExceptions(const SetPauseOnExceptionsParams ¶ms); + DispatchResponse SetSkipAllPauses(const SetSkipAllPausesParams ¶ms); DispatchResponse StepInto(const StepIntoParams ¶ms); DispatchResponse StepOut(); DispatchResponse StepOver(const StepOverParams ¶ms); @@ -122,7 +124,9 @@ public: void Resume(const DispatchRequest &request); void SetAsyncCallStackDepth(const DispatchRequest &request); void SetBreakpointByUrl(const DispatchRequest &request); + void SetBreakpointsActive(const DispatchRequest &request); void SetPauseOnExceptions(const DispatchRequest &request); + void SetSkipAllPauses(const DispatchRequest &request); void StepInto(const DispatchRequest &request); void StepOut(const DispatchRequest &request); void StepOver(const DispatchRequest &request); @@ -212,6 +216,8 @@ private: PauseOnExceptionsState pauseOnException_ {PauseOnExceptionsState::NONE}; DebuggerState debuggerState_ {DebuggerState::ENABLED}; bool pauseOnNextByteCode_ {false}; + bool breakpointsState_ {true}; + bool skipAllPausess_ {false}; std::unique_ptr singleStepper_ {nullptr}; std::vector nativePointer_; diff --git a/tooling/base/pt_params.cpp b/tooling/base/pt_params.cpp index 669f636d..989b2182 100644 --- a/tooling/base/pt_params.cpp +++ b/tooling/base/pt_params.cpp @@ -328,6 +328,48 @@ std::unique_ptr SetBreakpointByUrlParams::Create(const return paramsObject; } +std::unique_ptr SetBreakpointsActiveParams::Create(const PtJson ¶ms) +{ + auto paramsObject = std::make_unique(); + std::string error; + Result ret; + + bool breakpointsState; + ret = params.GetBool("active", &breakpointsState); + if (ret == Result::SUCCESS) { + paramsObject->breakpointsState_ = std::move(breakpointsState); + } else if (ret == Result::TYPE_ERROR) { // optional value + error += "Unknown 'active';"; + } + if (!error.empty()) { + LOG_DEBUGGER(ERROR) << "SetBreakpointsActiveParams::Create " << error; + return nullptr; + } + + return paramsObject; +} + +std::unique_ptr SetSkipAllPausesParams::Create(const PtJson ¶ms) +{ + auto paramsObject = std::make_unique(); + std::string error; + Result ret; + + bool skipAllPausesState; + ret = params.GetBool("skip", &skipAllPausesState); + if (ret == Result::SUCCESS) { + paramsObject->skipAllPausesState_ = std::move(skipAllPausesState); + } else if (ret == Result::TYPE_ERROR) { // optional value + error += "Unknown 'skip';"; + } + if (!error.empty()) { + LOG_DEBUGGER(ERROR) << "SetSkipAllPausesParams::Create " << error; + return nullptr; + } + + return paramsObject; +} + std::unique_ptr GetPossibleAndSetBreakpointParams::Create(const PtJson ¶ms) { auto paramsObject = std::make_unique(); diff --git a/tooling/base/pt_params.h b/tooling/base/pt_params.h index 66a3753d..f1ae793d 100644 --- a/tooling/base/pt_params.h +++ b/tooling/base/pt_params.h @@ -309,6 +309,43 @@ private: std::optional condition_ {}; }; + +class SetBreakpointsActiveParams : public PtBaseParams { +public: + SetBreakpointsActiveParams() = default; + ~SetBreakpointsActiveParams() override = default; + + static std::unique_ptr Create(const PtJson ¶ms); + + bool GetBreakpointsState() const + { + return breakpointsState_.value_or(false); + } +private: + NO_COPY_SEMANTIC(SetBreakpointsActiveParams); + NO_MOVE_SEMANTIC(SetBreakpointsActiveParams); + + std::optional breakpointsState_ {}; +}; + +class SetSkipAllPausesParams : public PtBaseParams { +public: + SetSkipAllPausesParams() = default; + ~SetSkipAllPausesParams() override = default; + + static std::unique_ptr Create(const PtJson ¶ms); + + bool GetSkipAllPausesState() const + { + return skipAllPausesState_.value_or(false); + } +private: + NO_COPY_SEMANTIC(SetSkipAllPausesParams); + NO_MOVE_SEMANTIC(SetSkipAllPausesParams); + + std::optional skipAllPausesState_ {}; +}; + class GetPossibleAndSetBreakpointParams : public PtBaseParams { public: GetPossibleAndSetBreakpointParams() = default; -- Gitee