В Rust, когда утверждение не удается, прыгайте в отладчик - PullRequest
0 голосов
/ 26 мая 2019

Простая библиотека, которая была очень удобной, даже незаменимой, в 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.

Я ищу помощь, чтобы сделать эту работу.Возможно преобразование в макросы или использование другой команды, чтобы привлечь внимание отладчиков.Я очень свеж с ржавчиной, поэтому, пожалуйста, будьте откровенны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...