diff --git a/Source/cmDebuggerWindowsPipeConnection.cxx b/Source/cmDebuggerWindowsPipeConnection.cxx index 1c6a2a7860..5f6f8484fe 100644 --- a/Source/cmDebuggerWindowsPipeConnection.cxx +++ b/Source/cmDebuggerWindowsPipeConnection.cxx @@ -221,13 +221,28 @@ void cmDebuggerPipeClient_WIN32::WaitForConnection() NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hPipe == INVALID_HANDLE_VALUE) { auto err = GetLastError(); - throw std::runtime_error("CreateFile failed with " + err); + throw std::runtime_error(std::string("CreateFile failed for pipe ") + + GetErrorMessage(err)); } pipes = std::make_unique(hPipe); } } +std::string cmDebuggerPipeClient_WIN32::GetErrorMessage(DWORD errorCode) +{ + LPSTR message = nullptr; + DWORD size = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&message, 0, nullptr); + std::string errorMessage = + this->PipeName + ": " + std::string(message, size); + LocalFree(message); + return errorMessage; +} + bool cmDebuggerPipeClient_WIN32::isOpen() { return pipes != nullptr; diff --git a/Source/cmDebuggerWindowsPipeConnection.h b/Source/cmDebuggerWindowsPipeConnection.h index 88ed1dee90..6a5743574b 100644 --- a/Source/cmDebuggerWindowsPipeConnection.h +++ b/Source/cmDebuggerWindowsPipeConnection.h @@ -90,6 +90,8 @@ public: bool write(void const* buffer, size_t n) override; private: + std::string GetErrorMessage(DWORD errorCode); + std::string const PipeName; std::unique_ptr pipes; };