在Rust中,当断言失败时跳入调试器

时间:2019-05-26 08:57:55

标签: visual-studio-code rust

一个简单的库,在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() {}
}}

如果需求或断言失败,则会将我弹出调试器。当我想将其关闭时,只需将include命令从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使用的是Windows的cppvsdbg。

我正在寻求帮助以使其正常工作。也许转换为宏或使用其他命令来引起调试器的注意。我生锈很新鲜,所以请明确。

0 个答案:

没有答案