diff --git a/src/xenia/cpu/backend/x64/x64_emitter.cc b/src/xenia/cpu/backend/x64/x64_emitter.cc index 51e9847fd..9b400c58f 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.cc +++ b/src/xenia/cpu/backend/x64/x64_emitter.cc @@ -437,15 +437,22 @@ uint64_t TrapDebugPrint(void* raw_context, uint64_t address) { auto thread_state = reinterpret_cast(raw_context)->thread_state; uint32_t str_ptr = uint32_t(thread_state->context()->r[3]); - // uint16_t str_len = uint16_t(thread_state->context()->r[4]); + uint32_t str_length = uint32_t(thread_state->context()->r[4]); + auto str = thread_state->memory()->TranslateVirtual(str_ptr); - // TODO(benvanik): truncate to length? - XELOGD("(DebugPrint) {}", str); + + // Allocate temporary buffer and null-terminate to respect length parameter + char* string_tmp = new char[str_length + 1]; + std::memcpy(string_tmp, str, str_length); + string_tmp[str_length] = 0; + + XELOGD("(DebugPrint) {}", string_tmp); if (cvars::debugprint_trap_log) { - debugging::DebugPrint("(DebugPrint) {}", str); + debugging::DebugPrint("(DebugPrint) {}", string_tmp); } + delete[] string_tmp; return 0; }