mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
minor: Break out of waiting for debugger on Windows using native debugger check API.
For Windows, this removes the need to add a breakpoint and modify a value to exit the debugger wait loop. As a ridealong, this adds a 100ms sleep for all platforms such that waiting for the debugger doesn't hog the CPU thread.
This commit is contained in:
parent
0a706f7d2a
commit
f8f7d37b8b
2 changed files with 25 additions and 7 deletions
|
@ -75,7 +75,7 @@ vfs.workspace = true
|
|||
paths.workspace = true
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
windows-sys = { version = "0.52", features = ["Win32_System_Threading"] }
|
||||
windows-sys = { version = "0.52", features = ["Win32_System_Diagnostics_Debug", "Win32_System_Threading"] }
|
||||
|
||||
[target.'cfg(not(target_env = "msvc"))'.dependencies]
|
||||
jemallocator = { version = "0.5.0", package = "tikv-jemallocator", optional = true }
|
||||
|
|
|
@ -10,7 +10,7 @@ extern crate rustc_driver as _;
|
|||
|
||||
mod rustc_wrapper;
|
||||
|
||||
use std::{env, fs, path::PathBuf, process::ExitCode, sync::Arc};
|
||||
use std::{env, fs, path::PathBuf, process::ExitCode, sync::Arc, thread::sleep};
|
||||
|
||||
use anyhow::Context;
|
||||
use lsp_server::Connection;
|
||||
|
@ -44,11 +44,7 @@ fn actual_main() -> anyhow::Result<ExitCode> {
|
|||
|
||||
#[cfg(debug_assertions)]
|
||||
if flags.wait_dbg || env::var("RA_WAIT_DBG").is_ok() {
|
||||
#[allow(unused_mut)]
|
||||
let mut d = 4;
|
||||
while d == 4 {
|
||||
d = 4;
|
||||
}
|
||||
wait_for_debugger();
|
||||
}
|
||||
|
||||
if let Err(e) = setup_logging(flags.log_file.clone()) {
|
||||
|
@ -96,6 +92,28 @@ fn actual_main() -> anyhow::Result<ExitCode> {
|
|||
Ok(ExitCode::SUCCESS)
|
||||
}
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
fn wait_for_debugger() {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
use windows_sys::Win32::System::Diagnostics::Debug::IsDebuggerPresent;
|
||||
// SAFETY: WinAPI generated code that is defensively marked `unsafe` but
|
||||
// in practice can not be used in an unsafe way.
|
||||
while unsafe { IsDebuggerPresent() } == 0 {
|
||||
sleep(std::time::Duration::from_millis(100));
|
||||
}
|
||||
}
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
{
|
||||
#[allow(unused_mut)]
|
||||
let mut d = 4;
|
||||
while d == 4 {
|
||||
d = 4;
|
||||
sleep(std::time::Duration::from_millis(100));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_logging(log_file_flag: Option<PathBuf>) -> anyhow::Result<()> {
|
||||
if cfg!(windows) {
|
||||
// This is required so that windows finds our pdb that is placed right beside the exe.
|
||||
|
|
Loading…
Reference in a new issue