diff --git a/src/coreclr/vm/excep.cpp b/src/coreclr/vm/excep.cpp index 25512830088f88..d3bd131910e86c 100644 --- a/src/coreclr/vm/excep.cpp +++ b/src/coreclr/vm/excep.cpp @@ -4793,9 +4793,9 @@ DefaultCatchHandlerExceptionMessageWorker(Thread* pThread, { message.Append(exceptionMessage); } - message.Append(W("\n")); PrintToStdErrW(message.GetUnicode()); + PrintToStdErrA("\n"); #if defined(FEATURE_EVENT_TRACE) && !defined(TARGET_UNIX) // Send the log to Windows Event Log diff --git a/src/native/minipal/log.c b/src/native/minipal/log.c index 6bbcfc1b02b1fe..5b62d4803ddb40 100644 --- a/src/native/minipal/log.c +++ b/src/native/minipal/log.c @@ -224,33 +224,43 @@ void minipal_log_flush_all(void) typedef ptrdiff_t ssize_t; -static int sync_file(minipal_log_flags flags) +static HANDLE get_std_handle(minipal_log_flags flags) { switch(flags) { case minipal_log_flags_fatal: case minipal_log_flags_error: - FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE)); - break; + return GetStdHandle(STD_ERROR_HANDLE); case minipal_log_flags_warning: case minipal_log_flags_info: case minipal_log_flags_debug: case minipal_log_flags_verbose: - default: - FlushFileBuffers(GetStdHandle(STD_OUTPUT_HANDLE)); - break; + return GetStdHandle(STD_OUTPUT_HANDLE); } + return INVALID_HANDLE_VALUE; +} + + +static int sync_file(minipal_log_flags flags) +{ + FlushFileBuffers(get_std_handle(flags)); return 0; } -static ssize_t write_file(int fd, const char* msg, size_t bytes_to_write) +static ssize_t write_file_binary(minipal_log_flags flags, const char* msg, size_t bytes_to_write) { assert(bytes_to_write < INT_MAX); - return _write(fd, msg, (unsigned int)bytes_to_write); + + DWORD bytes_written = 0; + return WriteFile(get_std_handle(flags), msg, (DWORD)bytes_to_write, &bytes_written, NULL) ? (ssize_t)bytes_written : (ssize_t)-1; } -#define fileno _fileno +static ssize_t write_file(minipal_log_flags flags, const char* msg, size_t bytes_to_write) +{ + assert(bytes_to_write < INT_MAX); + return _write(_fileno(get_std_file(flags)), msg, (unsigned int)bytes_to_write); +} #else #if defined(__APPLE__) #include @@ -280,25 +290,47 @@ static int sync_file(minipal_log_flags flags) } #endif -static ssize_t write_file(int fd, const char* msg, size_t bytes_to_write) +static ssize_t write_file(minipal_log_flags flags, const char* msg, size_t bytes_to_write) { ssize_t ret = 0; - while ((ret = write(fd, msg, bytes_to_write)) < 0 && errno == EINTR); + while ((ret = write(fileno(get_std_file(flags)), msg, bytes_to_write)) < 0 && errno == EINTR); return ret; } #endif +typedef ssize_t (*write_file_fnptr)(minipal_log_flags flags, const char* msg, size_t bytes_to_write); + int minipal_log_write(minipal_log_flags flags, const char* msg) { assert(msg != NULL && msg[0] != '\0'); - size_t bytes_to_write = strlen(msg); + size_t bytes_to_write = 0; size_t bytes_written = 0; - int fd = fileno(get_std_file(flags)); + write_file_fnptr write_fnptr = write_file; + +#ifdef HOST_WINDOWS + const char* msg_char = msg; + while (*msg_char) + { if (msg_char[0] == '\r' && msg_char[1] == '\n') + { + write_fnptr = write_file_binary; + break; + } + msg_char++; + } + + while (*msg_char) + msg_char++; + + bytes_to_write = msg_char - msg; +#else + bytes_to_write = strlen(msg); +#endif + while (bytes_to_write > 0) { - ssize_t chunk_written = write_file(fd, msg, bytes_to_write < MINIPAL_LOG_MAX_PAYLOAD ? bytes_to_write : MINIPAL_LOG_MAX_PAYLOAD); + ssize_t chunk_written = write_fnptr(flags, msg, bytes_to_write < MINIPAL_LOG_MAX_PAYLOAD ? bytes_to_write : MINIPAL_LOG_MAX_PAYLOAD); if (chunk_written <= 0) break;