Rollup merge of #132093 - jieyouxu:suppress-wer, r=onur-ozkan
compiletest: suppress Windows Error Reporting (WER) for `run-make` tests WER by default will show a *bunch* of error dialogues for missing DLLs on Windows for `run-make` tests. We address that by: 1. Guarding `run-make` test process spawning with `disable_error_reporting`. 2. Fixing `disable_error_reporting` to also add the [`SEM_FAILCRITICALERRORS` flag to `SetErrorMode`][SetErrorMode]. Just `SEM_NOGPFAULTERRORBOX` was not sufficient to suppress error dialogues for e.g. missing DLLs. Fixes #132092. In particular, refer to that issue for the necessary conditions to observe these dialogues from popping up in the first place. I was only able to manually test this locally in my "native" Windows msvc environment and it prevents the WER dialogues from popping up, I don't think it's possible to really test this automatically. [SetErrorMode]: https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-seterrormode?redirectedfrom=MSDN#parameters
This commit is contained in:
commit
3fea422be8
2 changed files with 17 additions and 9 deletions
|
|
@ -59,7 +59,7 @@ fn disable_error_reporting<F: FnOnce() -> R, R>(f: F) -> R {
|
|||
use std::sync::Mutex;
|
||||
|
||||
use windows::Win32::System::Diagnostics::Debug::{
|
||||
SEM_NOGPFAULTERRORBOX, SetErrorMode, THREAD_ERROR_MODE,
|
||||
SEM_FAILCRITICALERRORS, SEM_NOGPFAULTERRORBOX, SetErrorMode, THREAD_ERROR_MODE,
|
||||
};
|
||||
|
||||
static LOCK: Mutex<()> = Mutex::new(());
|
||||
|
|
@ -67,13 +67,21 @@ fn disable_error_reporting<F: FnOnce() -> R, R>(f: F) -> R {
|
|||
// Error mode is a global variable, so lock it so only one thread will change it
|
||||
let _lock = LOCK.lock().unwrap();
|
||||
|
||||
// Tell Windows to not show any UI on errors (such as terminating abnormally).
|
||||
// This is important for running tests, since some of them use abnormal
|
||||
// termination by design. This mode is inherited by all child processes.
|
||||
// Tell Windows to not show any UI on errors (such as terminating abnormally). This is important
|
||||
// for running tests, since some of them use abnormal termination by design. This mode is
|
||||
// inherited by all child processes.
|
||||
//
|
||||
// Note that `run-make` tests require `SEM_FAILCRITICALERRORS` in addition to suppress Windows
|
||||
// Error Reporting (WER) error dialogues that come from "critical failures" such as missing
|
||||
// DLLs.
|
||||
//
|
||||
// See <https://github.com/rust-lang/rust/issues/132092> and
|
||||
// <https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-seterrormode?redirectedfrom=MSDN>.
|
||||
unsafe {
|
||||
let old_mode = SetErrorMode(SEM_NOGPFAULTERRORBOX); // read inherited flags
|
||||
// read inherited flags
|
||||
let old_mode = SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
|
||||
let old_mode = THREAD_ERROR_MODE(old_mode);
|
||||
SetErrorMode(old_mode | SEM_NOGPFAULTERRORBOX);
|
||||
SetErrorMode(old_mode | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
|
||||
let r = f();
|
||||
SetErrorMode(old_mode);
|
||||
r
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use std::path::Path;
|
|||
use std::process::{Command, Output, Stdio};
|
||||
use std::{env, fs};
|
||||
|
||||
use super::{ProcRes, TestCx};
|
||||
use super::{ProcRes, TestCx, disable_error_reporting};
|
||||
use crate::util::{copy_dir_all, dylib_env_var};
|
||||
|
||||
impl TestCx<'_> {
|
||||
|
|
@ -514,8 +514,8 @@ impl TestCx<'_> {
|
|||
}
|
||||
}
|
||||
|
||||
let (Output { stdout, stderr, status }, truncated) =
|
||||
self.read2_abbreviated(cmd.spawn().expect("failed to spawn `rmake`"));
|
||||
let proc = disable_error_reporting(|| cmd.spawn().expect("failed to spawn `rmake`"));
|
||||
let (Output { stdout, stderr, status }, truncated) = self.read2_abbreviated(proc);
|
||||
if !status.success() {
|
||||
let res = ProcRes {
|
||||
status,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue