From b3537cc2dd56ea65e9ac6596918ef4416ea68637 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 19 Jan 2025 18:17:05 +0100 Subject: [PATCH] Report application exit --- src/gdb-stub/gdb_stub.cpp | 7 +++++++ src/gdb-stub/gdb_stub.hpp | 2 ++ .../debugging/win_x64_gdb_stub_handler.hpp | 11 +++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/gdb-stub/gdb_stub.cpp b/src/gdb-stub/gdb_stub.cpp index ab7fc201..81176e6a 100644 --- a/src/gdb-stub/gdb_stub.cpp +++ b/src/gdb-stub/gdb_stub.cpp @@ -204,6 +204,13 @@ namespace gdb_stub void signal_stop(const debugging_context& c) { + const auto exit_status = c.handler.get_exit_code(); + if (exit_status) + { + c.connection.send_reply(*exit_status == 0 ? "W00" : "WFF"); + return; + } + const auto id = c.handler.get_current_thread_id(); const auto hex_id = utils::string::to_hex_number(id); c.connection.send_reply("T05thread:" + hex_id + ";"); diff --git a/src/gdb-stub/gdb_stub.hpp b/src/gdb-stub/gdb_stub.hpp index ffb22bdf..a29146a3 100644 --- a/src/gdb-stub/gdb_stub.hpp +++ b/src/gdb-stub/gdb_stub.hpp @@ -48,6 +48,8 @@ namespace gdb_stub virtual uint32_t get_current_thread_id() = 0; virtual std::vector get_thread_ids() = 0; + + virtual std::optional get_exit_code() = 0; }; bool run_gdb_stub(const network::address& bind_address, debugging_handler& handler); diff --git a/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp b/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp index 7b9f520e..ea77d3dd 100644 --- a/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp +++ b/src/windows-emulator/debugging/win_x64_gdb_stub_handler.hpp @@ -68,6 +68,17 @@ class win_x64_gdb_stub_handler : public x64_gdb_stub_handler return this->win_emu_->activate_thread(thread_id); } + std::optional get_exit_code() override + { + const auto status = this->win_emu_->process().exit_status; + if (!status) + { + return std::nullopt; + } + + return static_cast(*status); + } + private: windows_emulator* win_emu_{}; };