diff --git a/appveyor.yml b/appveyor.yml index cb3b50cbaeff2..521ab00d0bfaf 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -96,6 +96,13 @@ install: - 7z x -y sccache.tar > nul - set PATH=%PATH%;%CD%\sccache2 + # Help debug some handle issues on AppVeyor + - ps: Invoke-WebRequest -Uri https://download.sysinternals.com/files/Handle.zip -OutFile handle.zip + - mkdir handle + - ps: Expand-Archive handle.zip -dest handle + - set PATH=%PATH%;%CD%\handle + - handle.exe -accepteula -help + test_script: - git submodule update --init - set SRC=. diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index d729deb8605d2..05f9beca3d11a 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1619,10 +1619,48 @@ actual:\n\ } fn fatal_proc_rec(&self, err: &str, proc_res: &ProcRes) -> ! { + self.try_print_open_handles(); self.error(err); proc_res.fatal(None); } + // This function is a poor man's attempt to debug rust-lang/rust#38620, if + // that's closed then this should be deleted + // + // This is a very "opportunistic" debugging attempt, so we ignore all + // errors here. + fn try_print_open_handles(&self) { + if !cfg!(windows) { + return + } + if self.config.mode != Incremental { + return + } + + let filename = match self.testpaths.file.file_stem() { + Some(path) => path, + None => return, + }; + + let mut cmd = Command::new("handle.exe"); + cmd.arg("-a").arg("-u"); + cmd.arg(filename); + cmd.arg("-nobanner"); + let output = match cmd.output() { + Ok(output) => output, + Err(_) => return, + }; + println!("---------------------------------------------------"); + println!("ran extra command to debug rust-lang/rust#38620: "); + println!("{:?}", cmd); + println!("result: {}", output.status); + println!("--- stdout ----------------------------------------"); + println!("{}", String::from_utf8_lossy(&output.stdout)); + println!("--- stderr ----------------------------------------"); + println!("{}", String::from_utf8_lossy(&output.stderr)); + println!("---------------------------------------------------"); + } + fn _arm_exec_compiled_test(&self, env: Vec<(String, String)>) -> ProcRes { let args = self.make_run_args(); let cmdline = self.make_cmdline("", &args.prog, &args.args);