diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 225f92d69..f6f5c4154 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -1035,12 +1035,6 @@ void HandlePacket() {
         return;
     }
 
-    if (HasHioRequest()) {
-        const auto reply = BuildHioRequestPacket();
-        SendReply(reply.data());
-        return;
-    }
-
     if (!IsDataAvailable()) {
         return;
     }
@@ -1059,8 +1053,12 @@ void HandlePacket() {
     case 'c':
     case 'C':
     case 's':
-        //
-        ;
+        if (HasHioRequest()) {
+            // Really, this request needs to get sent _after_ the step or continue
+            // began, but not sure how to schedule that...
+            const auto request_packet = BuildHioRequestPacket();
+            SendReply(request_packet.data());
+        }
     }
 
     switch (command_buffer[0]) {
diff --git a/src/core/gdbstub/hio.cpp b/src/core/gdbstub/hio.cpp
index b66fe09aa..7e3c6d61e 100644
--- a/src/core/gdbstub/hio.cpp
+++ b/src/core/gdbstub/hio.cpp
@@ -36,12 +36,15 @@ void SetHioRequest(const VAddr addr) {
     auto& memory = Core::System::GetInstance().Memory();
     memory.ReadBlock(*process, addr, &current_hio_request, sizeof(PackedGdbHioRequest));
 
-    // TODO read + check request magic header
-
-    current_hio_request_addr = addr;
-    sent_request = false;
-
-    LOG_DEBUG(Debug_GDBStub, "HIO request initiated");
+    if (std::string_view{current_hio_request.magic} != "GDB") {
+        LOG_WARNING(Debug_GDBStub, "Invalid HIO request sent by application");
+        current_hio_request_addr = 0;
+        current_hio_request = {};
+    } else {
+        current_hio_request_addr = addr;
+        sent_request = false;
+        LOG_DEBUG(Debug_GDBStub, "HIO request initiated");
+    }
 }
 
 bool HandleHioReply(const u8* const command_buffer, const u32 command_length) {
@@ -132,41 +135,37 @@ bool HasHioRequest() {
 }
 
 std::string BuildHioRequestPacket() {
-    char buf[256 + 1];
-    char tmp[32 + 1];
+    std::stringstream packet;
+    // TODO:use the IntToGdbHex funcs instead std::hex ?
+    packet << "F" << current_hio_request.function_name << std::hex;
+
     u32 nStr = 0;
 
-    // TODO: c++ify this and use the IntToGdbHex funcs instead of snprintf
-
-    snprintf(buf, 256, "F%s", current_hio_request.function_name);
-
     for (u32 i = 0; i < 8 && current_hio_request.param_format[i] != 0; i++) {
         switch (current_hio_request.param_format[i]) {
         case 'i':
         case 'I':
         case 'p':
-            snprintf(tmp, 32, ",%x", (u32)current_hio_request.parameters[i]);
+            packet << "," << (u32)current_hio_request.parameters[i];
             break;
         case 'l':
         case 'L':
-            snprintf(tmp, 32, ",%llx", current_hio_request.parameters[i]);
+            packet << "," << current_hio_request.parameters[i];
             break;
         case 's':
-            snprintf(tmp, 32, ",%x/%zx", (u32)current_hio_request.parameters[i],
-                     current_hio_request.string_lengths[nStr++]);
+            packet << "," << (u32)current_hio_request.parameters[i] << "/"
+                   << current_hio_request.string_lengths[nStr++];
             break;
         default:
-            tmp[0] = 0;
+            packet << '\0';
             break;
         }
-        strcat(buf, tmp);
     }
 
-    auto packet = std::string{buf, strlen(buf)};
-    LOG_DEBUG(Debug_GDBStub, "HIO request packet: {}", packet);
+    LOG_DEBUG(Debug_GDBStub, "HIO request packet: {}", packet.str());
     sent_request = true;
 
-    return packet;
+    return packet.str();
 }
 
 } // namespace GDBStub