diff options
Diffstat (limited to 'editor/debugger')
-rw-r--r-- | editor/debugger/editor_debugger_node.cpp | 2 | ||||
-rw-r--r-- | editor/debugger/editor_debugger_server.cpp | 2 | ||||
-rw-r--r-- | editor/debugger/editor_debugger_server.h | 4 | ||||
-rw-r--r-- | editor/debugger/editor_profiler.cpp | 55 | ||||
-rw-r--r-- | editor/debugger/script_editor_debugger.cpp | 85 | ||||
-rw-r--r-- | editor/debugger/script_editor_debugger.h | 5 |
6 files changed, 105 insertions, 48 deletions
diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index 3ef9548727..ded0ee3aa7 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -209,7 +209,7 @@ void EditorDebuggerNode::stop() { // Also close all debugging sessions. _for_all(tabs, [&](ScriptEditorDebugger *dbg) { if (dbg->is_session_active()) { - dbg->stop(); + dbg->_stop_and_notify(); } }); _break_state_changed(); diff --git a/editor/debugger/editor_debugger_server.cpp b/editor/debugger/editor_debugger_server.cpp index 4add891bcb..662f247062 100644 --- a/editor/debugger/editor_debugger_server.cpp +++ b/editor/debugger/editor_debugger_server.cpp @@ -40,7 +40,7 @@ class EditorDebuggerServerTCP : public EditorDebuggerServer { private: - Ref<TCP_Server> server; + Ref<TCPServer> server; public: static EditorDebuggerServer *create(const String &p_protocol); diff --git a/editor/debugger/editor_debugger_server.h b/editor/debugger/editor_debugger_server.h index 6458421e7a..6216d0df3d 100644 --- a/editor/debugger/editor_debugger_server.h +++ b/editor/debugger/editor_debugger_server.h @@ -32,9 +32,9 @@ #define EDITOR_DEBUGGER_CONNECTION_H #include "core/debugger/remote_debugger_peer.h" -#include "core/object/reference.h" +#include "core/object/ref_counted.h" -class EditorDebuggerServer : public Reference { +class EditorDebuggerServer : public RefCounted { public: typedef EditorDebuggerServer *(*CreateServerFunc)(const String &p_uri); diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 6befee090b..d60e2783ec 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -508,23 +508,35 @@ Vector<Vector<String>> EditorProfiler::get_data_as_csv() const { return res; } - // signatures - Vector<String> signatures; - const Vector<EditorProfiler::Metric::Category> &categories = frame_metrics[0].categories; - - for (int j = 0; j < categories.size(); j++) { - const EditorProfiler::Metric::Category &c = categories[j]; - signatures.push_back(c.signature); - - for (int k = 0; k < c.items.size(); k++) { - signatures.push_back(c.items[k].signature); + // Different metrics may contain different number of categories. + Set<StringName> possible_signatures; + for (int i = 0; i < frame_metrics.size(); i++) { + const Metric &m = frame_metrics[i]; + if (!m.valid) { + continue; + } + for (Map<StringName, Metric::Category *>::Element *E = m.category_ptrs.front(); E; E = E->next()) { + possible_signatures.insert(E->key()); + } + for (Map<StringName, Metric::Category::Item *>::Element *E = m.item_ptrs.front(); E; E = E->next()) { + possible_signatures.insert(E->key()); } } + + // Generate CSV header and cache indices. + Map<StringName, int> sig_map; + Vector<String> signatures; + signatures.resize(possible_signatures.size()); + int sig_index = 0; + for (const Set<StringName>::Element *E = possible_signatures.front(); E; E = E->next()) { + signatures.write[sig_index] = E->get(); + sig_map[E->get()] = sig_index; + sig_index++; + } res.push_back(signatures); // values Vector<String> values; - values.resize(signatures.size()); int index = last_metric; @@ -535,20 +547,23 @@ Vector<Vector<String>> EditorProfiler::get_data_as_csv() const { index = 0; } - if (!frame_metrics[index].valid) { + const Metric &m = frame_metrics[index]; + + if (!m.valid) { continue; } - int it = 0; - const Vector<EditorProfiler::Metric::Category> &frame_cat = frame_metrics[index].categories; - for (int j = 0; j < frame_cat.size(); j++) { - const EditorProfiler::Metric::Category &c = frame_cat[j]; - values.write[it++] = String::num_real(c.total_time); + // Don't keep old values since there may be empty cells. + values.clear(); + values.resize(possible_signatures.size()); - for (int k = 0; k < c.items.size(); k++) { - values.write[it++] = String::num_real(c.items[k].total); - } + for (Map<StringName, Metric::Category *>::Element *E = m.category_ptrs.front(); E; E = E->next()) { + values.write[sig_map[E->key()]] = String::num_real(E->value()->total_time); + } + for (Map<StringName, Metric::Category::Item *>::Element *E = m.item_ptrs.front(); E; E = E->next()) { + values.write[sig_map[E->key()]] = String::num_real(E->value()->total); } + res.push_back(values); } diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index c92e94270e..7493cc2a8d 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -35,6 +35,8 @@ #include "core/debugger/remote_debugger.h" #include "core/io/marshalls.h" #include "core/string/ustring.h" +#include "core/version.h" +#include "core/version_hash.gen.h" #include "editor/debugger/editor_network_profiler.h" #include "editor/debugger/editor_performance_profiler.h" #include "editor/debugger/editor_profiler.h" @@ -218,7 +220,7 @@ void ScriptEditorDebugger::_file_selected(const String &p_file) { file->store_csv_line(headers); if (vmem_tree->get_root()) { - TreeItem *ti = vmem_tree->get_root()->get_children(); + TreeItem *ti = vmem_tree->get_root()->get_first_child(); while (ti) { Vector<String> values; values.resize(vmem_tree->get_columns()); @@ -1317,7 +1319,7 @@ bool ScriptEditorDebugger::is_skip_breakpoints() { void ScriptEditorDebugger::_error_activated() { TreeItem *selected = error_tree->get_selected(); - TreeItem *ci = selected->get_children(); + TreeItem *ci = selected->get_first_child(); if (ci) { selected->set_collapsed(!selected->is_collapsed()); } @@ -1339,7 +1341,7 @@ void ScriptEditorDebugger::_expand_errors_list() { return; } - TreeItem *item = root->get_children(); + TreeItem *item = root->get_first_child(); while (item) { item->set_collapsed(false); item = item->get_next(); @@ -1352,7 +1354,7 @@ void ScriptEditorDebugger::_collapse_errors_list() { return; } - TreeItem *item = root->get_children(); + TreeItem *item = root->get_first_child(); while (item) { item->set_collapsed(true); item = item->get_next(); @@ -1371,7 +1373,8 @@ void ScriptEditorDebugger::_error_tree_item_rmb_selected(const Vector2 &p_pos) { item_menu->set_size(Size2(1, 1)); if (error_tree->is_anything_selected()) { - item_menu->add_icon_item(get_theme_icon("ActionCopy", "EditorIcons"), TTR("Copy Error"), 0); + item_menu->add_icon_item(get_theme_icon("ActionCopy", "EditorIcons"), TTR("Copy Error"), ACTION_COPY_ERROR); + item_menu->add_icon_item(get_theme_icon("Instance", "EditorIcons"), TTR("Open C++ Source on GitHub"), ACTION_OPEN_SOURCE); } if (item_menu->get_item_count() > 0) { @@ -1381,30 +1384,64 @@ void ScriptEditorDebugger::_error_tree_item_rmb_selected(const Vector2 &p_pos) { } void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) { - TreeItem *ti = error_tree->get_selected(); - while (ti->get_parent() != error_tree->get_root()) { - ti = ti->get_parent(); - } + switch (p_option) { + case ACTION_COPY_ERROR: { + TreeItem *ti = error_tree->get_selected(); + while (ti->get_parent() != error_tree->get_root()) { + ti = ti->get_parent(); + } - String type; + String type; - if (ti->get_icon(0) == get_theme_icon("Warning", "EditorIcons")) { - type = "W "; - } else if (ti->get_icon(0) == get_theme_icon("Error", "EditorIcons")) { - type = "E "; - } + if (ti->get_icon(0) == get_theme_icon("Warning", "EditorIcons")) { + type = "W "; + } else if (ti->get_icon(0) == get_theme_icon("Error", "EditorIcons")) { + type = "E "; + } - String text = ti->get_text(0) + " "; - int rpad_len = text.length(); + String text = ti->get_text(0) + " "; + int rpad_len = text.length(); - text = type + text + ti->get_text(1) + "\n"; - TreeItem *ci = ti->get_children(); - while (ci) { - text += " " + ci->get_text(0).rpad(rpad_len) + ci->get_text(1) + "\n"; - ci = ci->get_next(); - } + text = type + text + ti->get_text(1) + "\n"; + TreeItem *ci = ti->get_first_child(); + while (ci) { + text += " " + ci->get_text(0).rpad(rpad_len) + ci->get_text(1) + "\n"; + ci = ci->get_next(); + } - DisplayServer::get_singleton()->clipboard_set(text); + DisplayServer::get_singleton()->clipboard_set(text); + } break; + + case ACTION_OPEN_SOURCE: { + TreeItem *ti = error_tree->get_selected(); + while (ti->get_parent() != error_tree->get_root()) { + ti = ti->get_parent(); + } + + // We only need the first child here (C++ source stack trace). + TreeItem *ci = ti->get_first_child(); + // Parse back the `file:line @ method()` string. + const Vector<String> file_line_number = ci->get_text(1).split("@")[0].strip_edges().split(":"); + ERR_FAIL_COND_MSG(file_line_number.size() < 2, "Incorrect C++ source stack trace file:line format (please report)."); + const String file = file_line_number[0]; + const int line_number = file_line_number[1].to_int(); + + // Construct a GitHub repository URL and open it in the user's default web browser. + if (String(VERSION_HASH).length() >= 1) { + // Git commit hash information available; use it for greater accuracy, including for development versions. + OS::get_singleton()->shell_open(vformat("https://github.com/godotengine/godot/blob/%s/%s#L%d", + VERSION_HASH, + file, + line_number)); + } else { + // Git commit hash information unavailable; fall back to tagged releases. + OS::get_singleton()->shell_open(vformat("https://github.com/godotengine/godot/blob/%s-stable/%s#L%d", + VERSION_NUMBER, + file, + line_number)); + } + } break; + } } void ScriptEditorDebugger::_tab_changed(int p_tab) { diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index e5fb3c35a9..a5731c9f9c 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -74,6 +74,11 @@ private: PROFILER_SCRIPTS_SERVERS }; + enum Actions { + ACTION_COPY_ERROR, + ACTION_OPEN_SOURCE, + }; + AcceptDialog *msgdialog; LineEdit *clicked_ctrl; |