-
Notifications
You must be signed in to change notification settings - Fork 0
GSOC Debugger #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
889f32f
2a047c3
3d11208
874fb85
9bdb79c
d7c0df2
346cf9f
609a590
777fa06
10c8c06
8df9839
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| { | ||
| "files.associations": { | ||
| "iostream": "cpp" | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,86 @@ | ||||||
| /************************************************************************************ | ||||||
| * Copyright (c) 2023, xeus-cpp contributors * | ||||||
| * Copyright (c) 2023, Johan Mabille, Loic Gouarin, Sylvain Corlay, Wolf Vollprecht * | ||||||
| * * | ||||||
| * Distributed under the terms of the BSD 3-Clause License. * | ||||||
| * * | ||||||
| * The full license is in the file LICENSE, distributed with this software. * | ||||||
| ************************************************************************************/ | ||||||
|
|
||||||
| #ifndef XEUS_CPP_DEBUGGER_HPP | ||||||
| #define XEUS_CPP_DEBUGGER_HPP | ||||||
|
|
||||||
| #ifdef __GNUC__ | ||||||
| #pragma GCC diagnostic push | ||||||
| #pragma GCC diagnostic ignored "-Wattributes" | ||||||
| #endif | ||||||
|
|
||||||
| #include <map> | ||||||
| #include <mutex> | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: included header map is not used directly [misc-include-cleaner]
Suggested change
|
||||||
| #include <set> | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: included header mutex is not used directly [misc-include-cleaner]
Suggested change
|
||||||
| #include <string> | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: included header set is not used directly [misc-include-cleaner]
Suggested change
|
||||||
|
|
||||||
| #include "nlohmann/json.hpp" | ||||||
| #include "xeus-zmq/xdebugger_base.hpp" | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: included header json.hpp is not used directly [misc-include-cleaner]
Suggested change
|
||||||
| #include "xeus_cpp_config.hpp" | ||||||
|
|
||||||
| namespace xcpp | ||||||
| { | ||||||
| class xdebuglldb_client; | ||||||
|
|
||||||
| class XEUS_CPP_API debugger : public xeus::xdebugger_base | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: class 'debugger' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions] class XEUS_CPP_API debugger : public xeus::xdebugger_base
^ |
||||||
| { | ||||||
| public: | ||||||
|
|
||||||
| using base_type = xeus::xdebugger_base; | ||||||
|
|
||||||
| debugger(xeus::xcontext& context, | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "xeus::xcontext" is directly included [misc-include-cleaner] include/xeus-cpp/xdebugger.hpp:12: - #ifdef __GNUC__
+ #include <xeus/xeus_context.hpp>
+ #ifdef __GNUC__ |
||||||
| const xeus::xconfiguration& config, | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "xeus::xconfiguration" is directly included [misc-include-cleaner] include/xeus-cpp/xdebugger.hpp:12: - #ifdef __GNUC__
+ #include <xeus/xkernel_configuration.hpp>
+ #ifdef __GNUC__ |
||||||
| const std::string& user_name, | ||||||
| const std::string& session_id, | ||||||
| const nl::json& debugger_config); | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "nlohmann::json" is directly included [misc-include-cleaner] include/xeus-cpp/xdebugger.hpp:12: - #ifdef __GNUC__
+ #include <nlohmann/json_fwd.hpp>
+ #ifdef __GNUC__ |
||||||
|
|
||||||
| virtual ~debugger(); | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [cppcoreguidelines-explicit-virtual-functions]
Suggested change
|
||||||
|
|
||||||
| private: | ||||||
|
|
||||||
| nl::json inspect_variables_request(const nl::json& message); | ||||||
| nl::json stack_trace_request(const nl::json& message); | ||||||
| nl::json attach_request(const nl::json& message); | ||||||
| nl::json configuration_done_request(const nl::json& message); | ||||||
|
|
||||||
| nl::json variables_request_impl(const nl::json& message) override; | ||||||
|
|
||||||
| bool start_lldb(); | ||||||
| bool start() override; | ||||||
| void stop() override; | ||||||
| xeus::xdebugger_info get_debugger_info() const override; | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: function 'get_debugger_info' should be marked [[nodiscard]] [modernize-use-nodiscard]
Suggested change
|
||||||
| std::string get_cell_temporary_file(const std::string& code) const override; | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: function 'get_cell_temporary_file' should be marked [[nodiscard]] [modernize-use-nodiscard]
Suggested change
|
||||||
|
|
||||||
| bool connect_to_lldb_tcp(); | ||||||
| std::string send_dap_message(const nl::json& message); | ||||||
| std::string receive_dap_response(); | ||||||
|
|
||||||
| xdebuglldb_client* p_debuglldb_client; | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: invalid case style for private member 'p_debuglldb_client' [readability-identifier-naming]
Suggested change
|
||||||
| std::string m_lldb_host; | ||||||
| std::string m_lldb_port; | ||||||
| std::string m_lldbdap_port; | ||||||
| nl::json m_debugger_config; | ||||||
| bool m_is_running; | ||||||
| int m_tcp_socket; | ||||||
| bool m_tcp_connected; | ||||||
| }; | ||||||
|
|
||||||
| XEUS_CPP_API | ||||||
| std::unique_ptr<xeus::xdebugger> make_cpp_debugger(xeus::xcontext& context, | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "std::unique_ptr" is directly included [misc-include-cleaner] include/xeus-cpp/xdebugger.hpp:12: - #ifdef __GNUC__
+ #include <memory>
+ #ifdef __GNUC__There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "xeus::xdebugger" is directly included [misc-include-cleaner] include/xeus-cpp/xdebugger.hpp:12: - #ifdef __GNUC__
+ #include <xeus/xdebugger.hpp>
+ #ifdef __GNUC__ |
||||||
| const xeus::xconfiguration& config, | ||||||
| const std::string& user_name, | ||||||
| const std::string& session_id, | ||||||
| const nl::json& debugger_config); | ||||||
| } | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: namespace 'xcpp' not terminated with a closing comment [llvm-namespace-comment]
Suggested change
Additional contextinclude/xeus-cpp/xdebugger.hpp:26: namespace 'xcpp' starts here namespace xcpp
^ |
||||||
|
|
||||||
| #ifdef __GNUC__ | ||||||
| #pragma GCC diagnostic pop | ||||||
| #endif | ||||||
|
|
||||||
| #endif | ||||||
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,147 @@ | ||||||||||||
| #pragma once | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: header is missing header guard [llvm-header-guard]
Suggested change
include/xeus-cpp/xshared_memory.hpp:-1: +
+ #endif |
||||||||||||
|
|
||||||||||||
| #include <string> | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: #includes are not sorted properly [llvm-include-order]
Suggested change
include/xeus-cpp/xshared_memory.hpp:4: - #include <atomic>
- #include <vector>
- #include <sstream>
+ #include <sstream>
+ #include <string>
+ #include <vector> |
||||||||||||
| #include <cstring> | ||||||||||||
| #include <atomic> | ||||||||||||
| #include <vector> | ||||||||||||
| #include <sstream> | ||||||||||||
|
|
||||||||||||
| struct SharedMemoryBuffer { | ||||||||||||
| // FIXED: Reduced buffer sizes to fit within 64KB system limit | ||||||||||||
| // Total struct size should be around 52KB, leaving room for other fields | ||||||||||||
| static constexpr size_t MAX_CODE_SIZE = 16 * 1024; // 16KB for code | ||||||||||||
| static constexpr size_t MAX_OUTPUT_SIZE = 16 * 1024; // 16KB for output | ||||||||||||
| static constexpr size_t MAX_ERROR_SIZE = 8 * 1024; // 8KB for errors | ||||||||||||
| static constexpr size_t MAX_COMPLETION_SIZE = 8 * 1024; // 8KB for completions | ||||||||||||
|
|
||||||||||||
| enum class RequestType : uint32_t { | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: enum 'RequestType' uses a larger base type ('uint32_t' (aka 'unsigned int'), size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size [performance-enum-size] enum class RequestType : uint32_t {
^There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "uint32_t" is directly included [misc-include-cleaner] include/xeus-cpp/xshared_memory.hpp:2: - #include <string>
+ #include <cstdint>
+ #include <string> |
||||||||||||
| NONE = 0, | ||||||||||||
| PROCESS_CODE, | ||||||||||||
| CODE_COMPLETE, | ||||||||||||
| EVALUATE, | ||||||||||||
| SHUTDOWN | ||||||||||||
| }; | ||||||||||||
|
|
||||||||||||
| enum class ResponseStatus : uint32_t { | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: enum 'ResponseStatus' uses a larger base type ('uint32_t' (aka 'unsigned int'), size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size [performance-enum-size] enum class ResponseStatus : uint32_t {
^ |
||||||||||||
| NONE = 0, | ||||||||||||
| SUCCESS, | ||||||||||||
| COMPILATION_ERROR, | ||||||||||||
| RUNTIME_ERROR, | ||||||||||||
| SYSTEM_ERROR | ||||||||||||
| }; | ||||||||||||
|
|
||||||||||||
| std::atomic<bool> request_ready{false}; | ||||||||||||
| std::atomic<bool> response_ready{false}; | ||||||||||||
| std::atomic<RequestType> request_type{RequestType::NONE}; | ||||||||||||
| std::atomic<ResponseStatus> response_status{ResponseStatus::NONE}; | ||||||||||||
|
|
||||||||||||
| char code_buffer[MAX_CODE_SIZE]; | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: do not declare C-style arrays, use std::array<> instead [cppcoreguidelines-avoid-c-arrays] char code_buffer[MAX_CODE_SIZE];
^ |
||||||||||||
| uint32_t code_length; | ||||||||||||
| int cursor_pos; | ||||||||||||
|
|
||||||||||||
| char output_buffer[MAX_OUTPUT_SIZE]; | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: do not declare C-style arrays, use std::array<> instead [cppcoreguidelines-avoid-c-arrays] char output_buffer[MAX_OUTPUT_SIZE];
^ |
||||||||||||
| char error_buffer[MAX_ERROR_SIZE]; | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: do not declare C-style arrays, use std::array<> instead [cppcoreguidelines-avoid-c-arrays] char error_buffer[MAX_ERROR_SIZE];
^ |
||||||||||||
| uint32_t output_length; | ||||||||||||
| uint32_t error_length; | ||||||||||||
| bool compilation_result; | ||||||||||||
| int64_t evaluation_result; | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: no header providing "int64_t" is directly included [misc-include-cleaner] int64_t evaluation_result;
^ |
||||||||||||
|
|
||||||||||||
| char completion_buffer[MAX_COMPLETION_SIZE]; // Use separate size constant | ||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. warning: do not declare C-style arrays, use std::array<> instead [cppcoreguidelines-avoid-c-arrays] char completion_buffer[MAX_COMPLETION_SIZE]; // Use separate size constant
^ |
||||||||||||
| uint32_t completion_length; | ||||||||||||
|
|
||||||||||||
| void reset() { | ||||||||||||
| request_ready.store(false, std::memory_order_relaxed); | ||||||||||||
| response_ready.store(false, std::memory_order_relaxed); | ||||||||||||
| request_type.store(RequestType::NONE, std::memory_order_relaxed); | ||||||||||||
| response_status.store(ResponseStatus::NONE, std::memory_order_relaxed); | ||||||||||||
| code_length = 0; | ||||||||||||
| output_length = 0; | ||||||||||||
| error_length = 0; | ||||||||||||
| completion_length = 0; | ||||||||||||
| cursor_pos = 0; | ||||||||||||
| compilation_result = false; | ||||||||||||
| evaluation_result = 0; | ||||||||||||
|
|
||||||||||||
| memset(code_buffer, 0, MAX_CODE_SIZE); | ||||||||||||
| memset(output_buffer, 0, MAX_OUTPUT_SIZE); | ||||||||||||
| memset(error_buffer, 0, MAX_ERROR_SIZE); | ||||||||||||
| memset(completion_buffer, 0, MAX_COMPLETION_SIZE); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| void set_code(const std::string& code) { | ||||||||||||
| code_length = std::min(code.length(), MAX_CODE_SIZE - 1); | ||||||||||||
| memcpy(code_buffer, code.c_str(), code_length); | ||||||||||||
| code_buffer[code_length] = '\0'; | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| std::string get_code() const { | ||||||||||||
| return std::string(code_buffer, code_length); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| void set_output(const std::string& output) { | ||||||||||||
| output_length = std::min(output.length(), MAX_OUTPUT_SIZE - 1); | ||||||||||||
| memcpy(output_buffer, output.c_str(), output_length); | ||||||||||||
| output_buffer[output_length] = '\0'; | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| std::string get_output() const { | ||||||||||||
| return std::string(output_buffer, output_length); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| void set_error(const std::string& error) { | ||||||||||||
| error_length = std::min(error.length(), MAX_ERROR_SIZE - 1); | ||||||||||||
| memcpy(error_buffer, error.c_str(), error_length); | ||||||||||||
| error_buffer[error_length] = '\0'; | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| std::string get_error() const { | ||||||||||||
| return std::string(error_buffer, error_length); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| void set_completions(const std::vector<std::string>& completions) { | ||||||||||||
| std::string combined; | ||||||||||||
| for (const auto& comp : completions) { | ||||||||||||
| if (!combined.empty()) combined += "\n"; | ||||||||||||
| combined += comp; | ||||||||||||
| } | ||||||||||||
| completion_length = std::min(combined.length(), MAX_COMPLETION_SIZE - 1); | ||||||||||||
| memcpy(completion_buffer, combined.c_str(), completion_length); | ||||||||||||
| completion_buffer[completion_length] = '\0'; | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| std::vector<std::string> get_completions() const { | ||||||||||||
| std::vector<std::string> result; | ||||||||||||
| std::string data(completion_buffer, completion_length); | ||||||||||||
| std::istringstream iss(data); | ||||||||||||
| std::string line; | ||||||||||||
| while (std::getline(iss, line)) { | ||||||||||||
| result.push_back(line); | ||||||||||||
| } | ||||||||||||
| return result; | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| // Helper function to get the total size of this struct | ||||||||||||
| static constexpr size_t total_size() { | ||||||||||||
| return sizeof(SharedMemoryBuffer); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| // Helper function to check if a given size can accommodate this struct | ||||||||||||
| static bool fits_in_size(size_t available_size) { | ||||||||||||
| return available_size >= sizeof(SharedMemoryBuffer); | ||||||||||||
| } | ||||||||||||
| }; | ||||||||||||
|
|
||||||||||||
| // Static assertion to ensure the struct fits in reasonable shared memory limits | ||||||||||||
| static_assert(sizeof(SharedMemoryBuffer) <= 65536, | ||||||||||||
| "SharedMemoryBuffer too large for typical shared memory limits"); | ||||||||||||
|
|
||||||||||||
| // Print size information for debugging | ||||||||||||
| inline void print_buffer_size_info() { | ||||||||||||
| std::cout << "SharedMemoryBuffer size breakdown:" << std::endl; | ||||||||||||
| std::cout << " Code buffer: " << SharedMemoryBuffer::MAX_CODE_SIZE << " bytes" << std::endl; | ||||||||||||
| std::cout << " Output buffer: " << SharedMemoryBuffer::MAX_OUTPUT_SIZE << " bytes" << std::endl; | ||||||||||||
| std::cout << " Error buffer: " << SharedMemoryBuffer::MAX_ERROR_SIZE << " bytes" << std::endl; | ||||||||||||
| std::cout << " Completion buffer: " << SharedMemoryBuffer::MAX_COMPLETION_SIZE << " bytes" << std::endl; | ||||||||||||
| std::cout << " Total struct size: " << sizeof(SharedMemoryBuffer) << " bytes" << std::endl; | ||||||||||||
| std::cout << " Fits in 64KB: " << (sizeof(SharedMemoryBuffer) <= 65536 ? "YES" : "NO") << std::endl; | ||||||||||||
| } | ||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
warning: header guard does not follow preferred style [llvm-header-guard]