mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 21:43:37 +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
|
paths.workspace = true
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[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]
|
[target.'cfg(not(target_env = "msvc"))'.dependencies]
|
||||||
jemallocator = { version = "0.5.0", package = "tikv-jemallocator", optional = true }
|
jemallocator = { version = "0.5.0", package = "tikv-jemallocator", optional = true }
|
||||||
|
|
|
@ -10,7 +10,7 @@ extern crate rustc_driver as _;
|
||||||
|
|
||||||
mod rustc_wrapper;
|
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 anyhow::Context;
|
||||||
use lsp_server::Connection;
|
use lsp_server::Connection;
|
||||||
|
@ -44,11 +44,7 @@ fn actual_main() -> anyhow::Result<ExitCode> {
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
if flags.wait_dbg || env::var("RA_WAIT_DBG").is_ok() {
|
if flags.wait_dbg || env::var("RA_WAIT_DBG").is_ok() {
|
||||||
#[allow(unused_mut)]
|
wait_for_debugger();
|
||||||
let mut d = 4;
|
|
||||||
while d == 4 {
|
|
||||||
d = 4;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Err(e) = setup_logging(flags.log_file.clone()) {
|
if let Err(e) = setup_logging(flags.log_file.clone()) {
|
||||||
|
@ -96,6 +92,28 @@ fn actual_main() -> anyhow::Result<ExitCode> {
|
||||||
Ok(ExitCode::SUCCESS)
|
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<()> {
|
fn setup_logging(log_file_flag: Option<PathBuf>) -> anyhow::Result<()> {
|
||||||
if cfg!(windows) {
|
if cfg!(windows) {
|
||||||
// This is required so that windows finds our pdb that is placed right beside the exe.
|
// This is required so that windows finds our pdb that is placed right beside the exe.
|
||||||
|
|
Loading…
Reference in a new issue