Простая библиотека, которая была очень удобной, даже незаменимой, в C # имеет вид
namespace SharedLibraries.Verification { public static class Verify {
// conditions that must be satisfied in order to use a module go here
public static void Require(bool B) {
if (B) return;
System.Diagnostics.Debugger.Break();
}
// things that should be provably true if the Require(s) of a module are met
public static void Assert(bool B) {
if (B) return;
System.Diagnostics.Debugger.Break();
}
public static void AssertFail() {
System.Diagnostics.Debugger.Break();
}
}}
namespace SharedLibraries.VerificationOff { public static class Verify {
[System.Diagnostics.Conditional("DoNotEverTurnThisOn")]
public static void Require(bool B) {}
[System.Diagnostics.Conditional("DoNotEverTurnThisOn")]
public static void Assert(bool B) {}
[System.Diagnostics.Conditional("DoNotEverTurnThisOn")]
public static void AssertFail() {}
}}
Если требование или утверждение не выполнено, она выводит меня в отладчик.Когда я хочу отключить его, я просто изменяю команду включения с Verification на VerificationOff.Он даже не будет вычислять «B», когда он выключен, поэтому нет никаких накладных расходов.
Я пробовал все виды разных вещей, чтобы попытаться заставить библиотеку Rust / VSCode сделать то же самое.Вот что у меня есть:
pub mod on {
pub fn require<Predicate: FnOnce() -> bool>(check : Predicate) {
if cfg!(debug_assertions) {
if !check() {
unsafe {
println!("before debug break");
winapi::um::debugapi::DebugBreak();
println!("after debug break");
}
}
}
}
pub fn assert<Predicate: FnOnce() -> bool>(check : Predicate) {
if cfg!(debug_assertions) {
if !check() {
unsafe {
winapi::um::debugapi::DebugBreak();
}
}
}
}
}
pub mod off {
pub fn require<Predicate: FnOnce() -> bool>(_check : Predicate) {}
pub fn assert <Predicate: FnOnce() -> bool>(_check : Predicate) {}
}
Это работает, по крайней мере, когда приведенный выше код находится в том же ящике, что и программа, которая выполняется.Но когда он включается из автономного ящика с использованием «внешнего верификатора ящика» (или любого другого имени), то всякий раз, когда утверждение не выполняется, программа просто падает, и отладчик закрывается.И он вылетает точно при вызове winapi.Отладчик vscode использует cppvsdbg для Windows.
Я ищу помощь, чтобы сделать эту работу.Возможно преобразование в макросы или использование другой команды, чтобы привлечь внимание отладчиков.Я очень свеж с ржавчиной, поэтому, пожалуйста, будьте откровенны.