From d5c58342e083a275ce4acbfd2b2453c53ab12c3f Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 13 Jul 2025 03:25:43 +0200 Subject: [PATCH] [yuzu_cmd] gdbstub option (#43) Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/43 Co-authored-by: lizzie Co-committed-by: lizzie --- src/yuzu_cmd/yuzu.cpp | 55 ++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index 005f5bf1db..c1d714be77 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -80,6 +83,7 @@ static void PrintHelp(const char* argv0) { " Nickname, password, address and port for multiplayer\n" "-p, --program Pass following string as arguments to executable\n" "-u, --user Select a specific user profile from 0 to 7\n" + "-d, --debug Run the GDB stub on a port from 1 to 65535\n" "-v, --version Output version information and exit\n"; } @@ -162,24 +166,22 @@ static void OnMessageReceived(const Network::ChatEntry& msg) { } static void OnStatusMessageReceived(const Network::StatusMessageEntry& msg) { - std::string message; - switch (msg.type) { - case Network::IdMemberJoin: - message = fmt::format("{} has joined", msg.nickname); - break; - case Network::IdMemberLeave: - message = fmt::format("{} has left", msg.nickname); - break; - case Network::IdMemberKicked: - message = fmt::format("{} has been kicked", msg.nickname); - break; - case Network::IdMemberBanned: - message = fmt::format("{} has been banned", msg.nickname); - break; - case Network::IdAddressUnbanned: - message = fmt::format("{} has been unbanned", msg.nickname); - break; - } + std::string message = [&]() { + switch (msg.type) { + case Network::IdMemberJoin: + return fmt::format("{} has joined", msg.nickname); + case Network::IdMemberLeave: + return fmt::format("{} has left", msg.nickname); + case Network::IdMemberKicked: + return fmt::format("{} has been kicked", msg.nickname); + case Network::IdMemberBanned: + return fmt::format("{} has been banned", msg.nickname); + case Network::IdAddressUnbanned: + return fmt::format("{} has been unbanned", msg.nickname); + default: + return std::string{}; + } + }(); if (!message.empty()) std::cout << std::endl << "* " << message << std::endl << std::endl; } @@ -209,10 +211,10 @@ int main(int argc, char** argv) { } #endif std::string filepath; - std::optional config_path; + std::optional config_path{}; std::string program_args; - std::optional selected_user; - + std::optional selected_user{}; + std::optional override_gdb_port{}; bool use_multiplayer = false; bool fullscreen = false; std::string nickname{}; @@ -222,6 +224,7 @@ int main(int argc, char** argv) { static struct option long_options[] = { // clang-format off + {"debug", no_argument, 0, 'd'}, {"config", required_argument, 0, 'c'}, {"fullscreen", no_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, @@ -235,9 +238,12 @@ int main(int argc, char** argv) { }; while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvp::c:u:", long_options, &option_index); + int arg = getopt_long(argc, argv, "g:fhvp::c:u:d:", long_options, &option_index); if (arg != -1) { switch (static_cast(arg)) { + case 'd': + override_gdb_port = static_cast(atoi(optarg)); + break; case 'c': config_path = optarg; break; @@ -323,6 +329,11 @@ int main(int argc, char** argv) { Settings::values.current_user = std::clamp(*selected_user, 0, 7); } + if (override_gdb_port.has_value()) { + Settings::values.use_gdbstub = true; + Settings::values.gdbstub_port = *override_gdb_port; + } + #ifdef _WIN32 LocalFree(argv_w); #endif