mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 13:17:31 +00:00 
			
		
		
		
	Provide default vprintf on UWP (#2725)
UWP apps do not have a console attached so any output to stdout/stderr is lost. Therefore, provide a default BH_VPRINTF in that case for debug builds which redirects output to the debugger.
This commit is contained in:
		
							parent
							
								
									77b6bce679
								
							
						
					
					
						commit
						3c9cd40aa6
					
				|  | @ -1108,19 +1108,17 @@ wasmtime_ssp_fd_write(wasm_exec_env_t exec_env, struct fd_table *curfds, | |||
|     error = blocking_op_writev(exec_env, fo->file_handle, iov, (int)iovcnt, | ||||
|                                nwritten); | ||||
| #else | ||||
|     ssize_t len = 0; | ||||
|     /* redirect stdout/stderr output to BH_VPRINTF function */ | ||||
|     if (fo->is_stdio) { | ||||
|         int i; | ||||
|         const struct iovec *iov1 = (const struct iovec *)iov; | ||||
| 
 | ||||
|         for (i = 0; i < (int)iovcnt; i++, iov1++) { | ||||
|             if (iov1->iov_len > 0 && iov1->iov_base) { | ||||
|         *nwritten = 0; | ||||
|         for (i = 0; i < (int)iovcnt; i++) { | ||||
|             if (iov[i].buf_len > 0 && iov[i].buf != NULL) { | ||||
|                 char format[16]; | ||||
| 
 | ||||
|                 /* make up format string "%.ns" */ | ||||
|                 snprintf(format, sizeof(format), "%%.%ds", (int)iov1->iov_len); | ||||
|                 len += (ssize_t)os_printf(format, iov1->iov_base); | ||||
|                 snprintf(format, sizeof(format), "%%.%ds", (int)iov[i].buf_len); | ||||
|                 *nwritten += (size_t)os_printf(format, iov[i].buf); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -179,6 +179,17 @@ typedef uint32_t os_raw_file_handle; | |||
| 
 | ||||
| #define bh_socket_t windows_handle * | ||||
| 
 | ||||
| // UWP apps do not have stdout/stderr handles so provide a default
 | ||||
| // implementation of vprintf on debug builds so output from WASI libc is sent to
 | ||||
| // the debugger and not lost completely.
 | ||||
| #if !defined(BH_VPRINTF) && !defined(NDEBUG) && WINAPI_PARTITION_DESKTOP == 0 | ||||
| int | ||||
| uwp_print_to_debugger(const char *format, va_list ap); | ||||
| 
 | ||||
| #define BH_VPRINTF uwp_print_to_debugger | ||||
| #define UWP_DEFAULT_VPRINTF | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -57,4 +57,37 @@ convert_windows_error_code(DWORD windows_error_code) | |||
|         default: | ||||
|             return __WASI_EINVAL; | ||||
|     } | ||||
| } | ||||
| } | ||||
| 
 | ||||
| #ifdef UWP_DEFAULT_VPRINTF | ||||
| int | ||||
| uwp_print_to_debugger(const char *format, va_list ap) | ||||
| { | ||||
|     // Provide a stack buffer which should be large enough for any realistic
 | ||||
|     // string so we avoid making an allocation on every printf call.
 | ||||
|     char stack_buf[2048]; | ||||
|     char *buf = stack_buf; | ||||
|     int ret = vsnprintf(stack_buf, sizeof(stack_buf), format, ap); | ||||
| 
 | ||||
|     if (ret >= sizeof(stack_buf)) { | ||||
|         // Allocate an extra byte for the null terminator.
 | ||||
|         char *heap_buf = BH_MALLOC(ret + 1); | ||||
|         buf = heap_buf; | ||||
| 
 | ||||
|         if (heap_buf == NULL) { | ||||
|             errno = ENOMEM; | ||||
|             return -1; | ||||
|         } | ||||
| 
 | ||||
|         ret = vsnprintf(heap_buf, ret + 1, format, ap); | ||||
|     } | ||||
| 
 | ||||
|     if (ret >= 0) | ||||
|         OutputDebugStringA(buf); | ||||
| 
 | ||||
|     if (buf != stack_buf) | ||||
|         BH_FREE(buf); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 zoraaver
						zoraaver