diff options
author | Glen Chung <kuchung@microsoft.com> | 2023-03-16 00:50:08 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-05-30 13:46:12 (GMT) |
commit | a9a592f96e6498da302f8e968be1db0ad3c32123 (patch) | |
tree | 0d75f16ee2eae99b1a3f063e575b3f5f8f2ee931 /Source/cmDebuggerVariables.h | |
parent | b0d1ddb7234950374977b83f8dbded806c15b356 (diff) | |
download | CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.zip CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.tar.gz CMake-a9a592f96e6498da302f8e968be1db0ad3c32123.tar.bz2 |
cmake: Add debugger
- Depends on cppdap and jsoncpp.
- Add --debugger argument to enable the Debugger.
- Add --debugger-pipe argument for DAP traffics over named pipes.
- Support breakpoints by filenames and line numbers.
- Support exception breakpoints.
- Call stack shows filenames and line numbers.
- Show Cache Variables.
- Show the state of currently defined targets,
tests and directories with their properties.
- Add cmakeVersion to DAP initialize response.
- Include unit tests.
Co-authored-by: Ben McMorran <bemcmorr@microsoft.com>
Diffstat (limited to 'Source/cmDebuggerVariables.h')
-rw-r--r-- | Source/cmDebuggerVariables.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/Source/cmDebuggerVariables.h b/Source/cmDebuggerVariables.h new file mode 100644 index 0000000..eaaf2a8 --- /dev/null +++ b/Source/cmDebuggerVariables.h @@ -0,0 +1,124 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#pragma once + +#include "cmConfigure.h" // IWYU pragma: keep + +#include <atomic> +#include <cstdint> +#include <functional> +#include <memory> +#include <string> +#include <utility> +#include <vector> + +#include <cm3p/cppdap/types.h> // IWYU pragma: keep + +namespace cmDebugger { +class cmDebuggerVariablesManager; +} + +namespace dap { +struct Variable; +} + +namespace cmDebugger { + +struct cmDebuggerVariableEntry +{ + cmDebuggerVariableEntry() + : cmDebuggerVariableEntry("", "", "") + { + } + cmDebuggerVariableEntry(std::string name, std::string value, + std::string type) + : Name(std::move(name)) + , Value(std::move(value)) + , Type(std::move(type)) + { + } + cmDebuggerVariableEntry(std::string name, std::string value) + : Name(std::move(name)) + , Value(std::move(value)) + , Type("string") + { + } + cmDebuggerVariableEntry(std::string name, const char* value) + : Name(std::move(name)) + , Value(value == nullptr ? "" : value) + , Type("string") + { + } + cmDebuggerVariableEntry(std::string name, bool value) + : Name(std::move(name)) + , Value(value ? "TRUE" : "FALSE") + , Type("bool") + { + } + cmDebuggerVariableEntry(std::string name, int64_t value) + : Name(std::move(name)) + , Value(std::to_string(value)) + , Type("int") + { + } + cmDebuggerVariableEntry(std::string name, int value) + : Name(std::move(name)) + , Value(std::to_string(value)) + , Type("int") + { + } + std::string const Name; + std::string const Value; + std::string const Type; +}; + +class cmDebuggerVariables +{ + static std::atomic<int64_t> NextId; + int64_t Id; + std::string Name; + std::string Value; + + std::function<std::vector<cmDebuggerVariableEntry>()> GetKeyValuesFunction; + std::vector<std::shared_ptr<cmDebuggerVariables>> SubVariables; + bool IgnoreEmptyStringEntries = false; + bool EnableSorting = true; + + virtual dap::array<dap::Variable> HandleVariablesRequest(); + friend class cmDebuggerVariablesManager; + +protected: + const bool SupportsVariableType; + std::shared_ptr<cmDebuggerVariablesManager> VariablesManager; + void EnumerateSubVariablesIfAny( + dap::array<dap::Variable>& toBeReturned) const; + void ClearSubVariables(); + +public: + cmDebuggerVariables( + std::shared_ptr<cmDebuggerVariablesManager> variablesManager, + std::string name, bool supportsVariableType); + cmDebuggerVariables( + std::shared_ptr<cmDebuggerVariablesManager> variablesManager, + std::string name, bool supportsVariableType, + std::function<std::vector<cmDebuggerVariableEntry>()> getKeyValuesFunc); + inline int64_t GetId() const noexcept { return this->Id; } + inline std::string GetName() const noexcept { return this->Name; } + inline std::string GetValue() const noexcept { return this->Value; } + inline void SetValue(std::string const& value) noexcept + { + this->Value = value; + } + void AddSubVariables(std::shared_ptr<cmDebuggerVariables> const& variables); + inline void SetIgnoreEmptyStringEntries(bool value) noexcept + { + this->IgnoreEmptyStringEntries = value; + } + inline void SetEnableSorting(bool value) noexcept + { + this->EnableSorting = value; + } + virtual ~cmDebuggerVariables(); +}; + +} // namespace cmDebugger |