From 18bb8e671a79dad255924a155119d0283a31ba31 Mon Sep 17 00:00:00 2001 From: Relintai Date: Wed, 27 Jul 2022 15:07:09 +0200 Subject: [PATCH] Ported: [3.x] [Debugger] Add --debug-server CLI option. Automatically starts the editor debug server at given :. E.g.: # Run editor and debug server listening on any interface, port 8080 godot3 -e --path proj/proj_empty --debug-server *:8080 # Run the godot project connecting to that debug server. godot3 --path proj/proj_empty --remote-debug 127.0.0.1:8080 - Faless https://github.com/godotengine/godot/commit/225e75daba072ad31d7b7d7e74d5ca331bdf3c5d --- editor/script_editor_debugger.cpp | 16 +++++++++++----- editor/script_editor_debugger.h | 2 +- main/main.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index ee5954f43..e50c618ed 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -1593,8 +1593,10 @@ void ScriptEditorDebugger::_clear_execution() { stack_script.unref(); } -void ScriptEditorDebugger::start() { - stop(); +void ScriptEditorDebugger::start(int p_port, const IP_Address &p_bind_address) { + if (is_inside_tree()) { + stop(); + } if (is_visible_in_tree()) { EditorNode::get_singleton()->make_bottom_panel_item_visible(this); @@ -1606,7 +1608,11 @@ void ScriptEditorDebugger::start() { } const int max_tries = 6; - remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); + if (p_port < 0) { + remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); + } else { + remote_port = p_port; + } int current_try = 0; // Find first available port. Error err = server->listen(remote_port); @@ -1615,7 +1621,7 @@ void ScriptEditorDebugger::start() { current_try++; remote_port++; OS::get_singleton()->delay_usec(1000); - err = server->listen(remote_port); + err = server->listen(remote_port, p_bind_address); } // No suitable port found. if (err != OK) { @@ -1625,7 +1631,7 @@ void ScriptEditorDebugger::start() { EditorNode::get_singleton()->get_scene_tree_dock()->show_tab_buttons(); auto_switch_remote_scene_tree = (bool)EditorSettings::get_singleton()->get("debugger/auto_switch_to_remote_scene_tree"); - if (auto_switch_remote_scene_tree) { + if (is_inside_tree() && auto_switch_remote_scene_tree) { EditorNode::get_singleton()->get_scene_tree_dock()->show_remote_tree(); } diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index bd02dae7d..e1b5e0162 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -263,7 +263,7 @@ protected: static void _bind_methods(); public: - void start(); + void start(int p_port = -1, const IP_Address &p_bind_address = IP_Address("*")); void pause(); void unpause(); void stop(); diff --git a/main/main.cpp b/main/main.cpp index c36ccfc8f..9b95aee9a 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -78,6 +78,7 @@ #include "editor/editor_translation.h" #include "editor/progress_dialog.h" #include "editor/project_manager.h" +#include "editor/script_editor_debugger.h" #ifndef NO_EDITOR_SPLASH #include "main/splash_editor.gen.h" #endif @@ -127,6 +128,9 @@ static bool show_help = false; static bool auto_quit = false; static OS::ProcessID allow_focus_steal_pid = 0; static bool delta_sync_after_draw = false; +#ifdef TOOLS_ENABLED +static String debug_server_uri; +#endif // Display @@ -250,6 +254,7 @@ void Main::print_help(const char *p_binary) { #ifdef TOOLS_ENABLED OS::get_singleton()->print(" -e, --editor Start the editor instead of running the scene.\n"); OS::get_singleton()->print(" -p, --project-manager Start the project manager, even if a project is auto-detected.\n"); + OS::get_singleton()->print(" --debug-server
Start the editor debug server (:, e.g. 127.0.0.1:6007)\n"); #endif OS::get_singleton()->print(" -q, --quit Quit after the first iteration.\n"); OS::get_singleton()->print(" -l, --language Use a specific locale ( being a two-letter code).\n"); @@ -725,6 +730,18 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } else if (I->get() == "-p" || I->get() == "--project-manager") { // starts project manager project_manager = true; + } else if (I->get() == "--debug-server") { + if (I->next()) { + debug_server_uri = I->next()->get(); + if (debug_server_uri.find(":") == -1) { // wrong address + OS::get_singleton()->print("Invalid debug server address. It should be of the form :.\n"); + goto error; + } + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing remote debug server server, aborting.\n"); + goto error; + } } else if (I->get() == "--export" || I->get() == "--export-debug" || I->get() == "--export-pack") { // Export project editor = true; main_args.push_back(I->get()); @@ -2021,6 +2038,13 @@ bool Main::start() { ERR_PRINT("Failed to load scene"); } OS::get_singleton()->set_context(OS::CONTEXT_EDITOR); + // Start debug server. + if (!debug_server_uri.empty()) { + int idx = debug_server_uri.rfind(":"); + IP_Address addr = debug_server_uri.substr(0, idx); + int port = debug_server_uri.substr(idx + 1).to_int(); + ScriptEditor::get_singleton()->get_debugger()->start(port, addr); + } } #endif if (!editor) {