diff --git a/CMakeLists.txt b/CMakeLists.txt index 6213b5b6..3b6c6242 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,6 +180,9 @@ else() configure_native_kernel("/share/jupyter/kernels/xcpp17/") configure_native_kernel("/share/jupyter/kernels/xcpp20/") configure_native_kernel("/share/jupyter/kernels/xcpp23/") + configure_native_kernel("/share/jupyter/kernels/xcpp17-debugger/") + configure_native_kernel("/share/jupyter/kernels/xcpp20-debugger/") + configure_native_kernel("/share/jupyter/kernels/xcpp23-debugger/") endif() # Source files diff --git a/include/xeus-cpp/xdebugger.hpp b/include/xeus-cpp/xdebugger.hpp new file mode 100644 index 00000000..a4f12dda --- /dev/null +++ b/include/xeus-cpp/xdebugger.hpp @@ -0,0 +1,121 @@ +/************************************************************************************ + * Copyright (c) 2023, xeus-cpp contributors * + * * + * 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 +#include +#include +#include + +#include "nlohmann/json.hpp" +#include "xeus-cpp/xinterpreter.hpp" +#include "xeus-zmq/xdebugger_base.hpp" +#include "xeus_cpp_config.hpp" + +namespace xcpp +{ + class xdebuglldb_client; + + class XEUS_CPP_API debugger : public xeus::xdebugger_base + { + public: + + using base_type = xeus::xdebugger_base; + + debugger( + xeus::xcontext& context, + const xeus::xconfiguration& config, + const std::string& user_name, + const std::string& session_id, + const nl::json& debugger_config + ); + + virtual ~debugger(); + + 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 set_breakpoints_request(const nl::json& message); + nl::json dump_cell_request(const nl::json& message); + nl::json rich_inspect_variables_request(const nl::json& message); + nl::json copy_to_globals_request(const nl::json& message); + nl::json source_request(const nl::json& message); + + bool get_variable_info_from_lldb( + const std::string& var_name, + int frame_id, + nl::json& data, + nl::json& metadata, + int sequence + ); + void get_container_info( + const std::string& var_name, + int frame_id, + const std::string& var_type, + nl::json& data, + nl::json& metadata, + int sequence, + int size + ); + bool is_container_type(const std::string& type) const; + + bool start_lldb(); + bool start() override; + void stop() override; + xeus::xdebugger_info get_debugger_info() const override; + virtual std::string get_cell_temporary_file(const std::string& code) const override; + + bool connect_to_lldb_tcp(); + std::string send_dap_message(const nl::json& message); + std::string receive_dap_response(); + + xdebuglldb_client* p_debuglldb_client; + std::string m_lldb_host; + std::string m_lldb_port; + nl::json m_debugger_config; + bool m_is_running; + int m_tcp_socket; + bool m_tcp_connected; + pid_t jit_process_pid; + + using breakpoint_list_t = std::map>; + breakpoint_list_t m_breakpoint_list; + + xcpp::interpreter* m_interpreter; + + std::unordered_map> m_hash_to_sequential; + std::unordered_map m_sequential_to_hash; + + bool m_copy_to_globals_available; + }; + + XEUS_CPP_API + std::unique_ptr make_cpp_debugger( + xeus::xcontext& context, + const xeus::xconfiguration& config, + const std::string& user_name, + const std::string& session_id, + const nl::json& debugger_config + ); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + +#endif \ No newline at end of file diff --git a/share/jupyter/kernels/xcpp17-debugger/kernel.json.in b/share/jupyter/kernels/xcpp17-debugger/kernel.json.in new file mode 100644 index 00000000..a1e96cb4 --- /dev/null +++ b/share/jupyter/kernels/xcpp17-debugger/kernel.json.in @@ -0,0 +1,21 @@ +{ + "display_name": "C++17-Debugger", + "env": { + "PATH":"@XEUS_CPP_PATH@", + "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" + }, + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-g", + "-O0", + "--use-oop-jit", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c++17" + ], + "language": "cpp", + "metadata": {"debugger": true + } +} diff --git a/share/jupyter/kernels/xcpp17-debugger/logo-32x32.png b/share/jupyter/kernels/xcpp17-debugger/logo-32x32.png new file mode 100644 index 00000000..c09c4585 Binary files /dev/null and b/share/jupyter/kernels/xcpp17-debugger/logo-32x32.png differ diff --git a/share/jupyter/kernels/xcpp17-debugger/logo-64x64.png b/share/jupyter/kernels/xcpp17-debugger/logo-64x64.png new file mode 100644 index 00000000..396c2446 Binary files /dev/null and b/share/jupyter/kernels/xcpp17-debugger/logo-64x64.png differ diff --git a/share/jupyter/kernels/xcpp17-debugger/logo-svg.svg b/share/jupyter/kernels/xcpp17-debugger/logo-svg.svg new file mode 100644 index 00000000..5e117077 --- /dev/null +++ b/share/jupyter/kernels/xcpp17-debugger/logo-svg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/share/jupyter/kernels/xcpp20-debugger/kernel.json.in b/share/jupyter/kernels/xcpp20-debugger/kernel.json.in new file mode 100644 index 00000000..1df6c1cc --- /dev/null +++ b/share/jupyter/kernels/xcpp20-debugger/kernel.json.in @@ -0,0 +1,21 @@ +{ + "display_name": "C++20-Debugger", + "env": { + "PATH":"@XEUS_CPP_PATH@", + "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" + }, + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-g", + "-O0", + "--use-oop-jit", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c++20" + ], + "language": "cpp", + "metadata": {"debugger": true + } +} diff --git a/share/jupyter/kernels/xcpp20-debugger/logo-32x32.png b/share/jupyter/kernels/xcpp20-debugger/logo-32x32.png new file mode 100644 index 00000000..c09c4585 Binary files /dev/null and b/share/jupyter/kernels/xcpp20-debugger/logo-32x32.png differ diff --git a/share/jupyter/kernels/xcpp20-debugger/logo-64x64.png b/share/jupyter/kernels/xcpp20-debugger/logo-64x64.png new file mode 100644 index 00000000..396c2446 Binary files /dev/null and b/share/jupyter/kernels/xcpp20-debugger/logo-64x64.png differ diff --git a/share/jupyter/kernels/xcpp20-debugger/logo-svg.svg b/share/jupyter/kernels/xcpp20-debugger/logo-svg.svg new file mode 100644 index 00000000..5e117077 --- /dev/null +++ b/share/jupyter/kernels/xcpp20-debugger/logo-svg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/share/jupyter/kernels/xcpp23-debugger/kernel.json.in b/share/jupyter/kernels/xcpp23-debugger/kernel.json.in new file mode 100644 index 00000000..15087be3 --- /dev/null +++ b/share/jupyter/kernels/xcpp23-debugger/kernel.json.in @@ -0,0 +1,21 @@ +{ + "display_name": "C++23-Debugger", + "env": { + "PATH":"@XEUS_CPP_PATH@", + "LD_LIBRARY_PATH":"@XEUS_CPP_LD_LIBRARY_PATH@" + }, + "argv": [ + "@XEUS_CPP_KERNELSPEC_PATH@xcpp", + "-f", + "{connection_file}", + "-g", + "-O0", + "--use-oop-jit", + "-resource-dir", "@XEUS_CPP_RESOURCE_DIR@", + "-I", "@XEUS_CPP_INCLUDE_DIR@", + "-std=c++23" + ], + "language": "cpp", + "metadata": {"debugger": true + } +} diff --git a/share/jupyter/kernels/xcpp23-debugger/logo-32x32.png b/share/jupyter/kernels/xcpp23-debugger/logo-32x32.png new file mode 100644 index 00000000..396c2446 Binary files /dev/null and b/share/jupyter/kernels/xcpp23-debugger/logo-32x32.png differ diff --git a/share/jupyter/kernels/xcpp23-debugger/logo-64x64.png b/share/jupyter/kernels/xcpp23-debugger/logo-64x64.png new file mode 100644 index 00000000..c09c4585 Binary files /dev/null and b/share/jupyter/kernels/xcpp23-debugger/logo-64x64.png differ diff --git a/share/jupyter/kernels/xcpp23-debugger/logo-svg.svg b/share/jupyter/kernels/xcpp23-debugger/logo-svg.svg new file mode 100644 index 00000000..5e117077 --- /dev/null +++ b/share/jupyter/kernels/xcpp23-debugger/logo-svg.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + +