Rust의 dbg!매크로 정보

21062 단어 Rusttech

dbg! 매크로


Rust1.32.0stable에 추가된 매크로입니다.
https://doc.rust-lang.org/std/macro.dbg.html
이름과 같이 디버깅에 편리한 매크로입니다.
공식 및 결과를 표준 오류로 출력합니다.println!와 같은 매크로와 달리 공식을 직접 출력합니다.출력하고 값을 돌려주는 건 큰 차이야.

이용 방법

dbg! 매크로 출력 값은 TRAITDebug를 설치해야 합니다.
main.rs
#[allow(dead_code)]
struct S(usize);

fn main() {
    dbg!("rust"); // &strはDebugトレイトを実装している。
    // dbg!(S(0)); // SはDebugトレイトを実装していないためエラー
}
[src/main.rs:5] "rust" = "rust"
Rust Playground
공식의 결과Debug는 TRAIT만 설치하면 되고 공식을 직접 전달할 수도 있다.
main.rs
fn main() {
    dbg!(1 + 2 + 3 + 4);
}
[src/main.rs:2] 1 + 2 + 3 + 4 = 10
Rust Playground
공식의 결과Copy는 TRAIT를 실현하지 못하면 수치를 제출하면 원시 소유권을 잃게 된다.Copy TRAIT가 설치되어 있지 않더라도 참조교부를 진행하면 소유권이 유지됩니다.
main.rs
#![allow(unused_variables)]

#[derive(Debug)]
struct S(usize);

fn main() {
    let a = dbg!(S(1 + 2));
    let b = dbg!(a.0 + 1);
    // let c = dbg!(a).0 + 2; // Sはコピートレイトを実装していないためコンパイルエラー
    let d = dbg!(&a.0 + 1); // 参照渡しはOK
}
[src/main.rs:7] S(1 + 2) = S(
    3,
)
[src/main.rs:8] a.0 + 1 = 4
[src/main.rs:10] &a.0 + 1 = 4
Rust Playground Copy TRAIT가 구현되면 원래 소유권은 유지됩니다.
main.rs
#![allow(unused_variables)]

#[derive(Copy, Clone, Debug)]
struct S(usize);

fn main() {
    let a = dbg!(S(1 + 2));
    let b = dbg!(a.0 + 1);
    let c = dbg!(a).0 + 2; //SがCopyトレイトを実装しているためOK
    let d = dbg!(&a.0 + 1); // 参照渡しもOK
}
[src/main.rs:7] S(1 + 2) = S(
    3,
)
[src/main.rs:8] a.0 + 1 = 4
[src/main.rs:9] a = S(
    3,
)
[src/main.rs:10] &a.0 + 1 = 4
Rust Playground
실용적인 예로 이동전화를 디버깅하는 과정에서 사용할 수 있다.
main.rs
#![allow(unused_variables)]

fn main() {
    let x = (0..5)
        .map(|x| dbg!(x + 9))
        .map(|x| dbg!(x * 7))
        .fold(0, |acc, x| dbg!(acc + x));
}
[src/main.rs:5] x + 9 = 9
[src/main.rs:6] x * 7 = 63
[src/main.rs:7] acc + x = 63
[src/main.rs:5] x + 9 = 10
[src/main.rs:6] x * 7 = 70
[src/main.rs:7] acc + x = 133
[src/main.rs:5] x + 9 = 11
[src/main.rs:6] x * 7 = 77
[src/main.rs:7] acc + x = 210
[src/main.rs:5] x + 9 = 12
[src/main.rs:6] x * 7 = 84
[src/main.rs:7] acc + x = 294
[src/main.rs:5] x + 9 = 13
[src/main.rs:6] x * 7 = 91
[src/main.rs:7] acc + x = 385
Rust Playground
매개 변수에 정보를 보내지 않으면 매크로 설명의 파일 이름과 줄을 출력합니다.
main.rs
fn main() {
    dbg!()
}
[src/main.rs:2]
Rust Playground
여러 공식을 전달할 수도 있다.반환치는 원보로 돌아오세요.
main.rs
#![feature(type_name_of_val)]
fn main() {
    let a = dbg!(1 + 2, 3 + 4, 5 + 6, 7 + 8);
    dbg!(std::any::type_name_of_val(&a));
}
[src/main.rs:3] 1 + 2 = 3
[src/main.rs:3] 3 + 4 = 7
[src/main.rs:3] 5 + 6 = 11
[src/main.rs:3] 7 + 8 = 15
[src/main.rs:4] std::any::type_name_of_val(&a) = "(i32, i32, i32, i32)"
Rust Playground

dbg! 매크로 사용 시 경고/오류 및 Clipy 공동 작업 표시

dbg! 매크로는release가 구축될 때도 출력됩니다.
또한 버전 관리 시스템dbg!에서 매크로 사용을 오류로 설정하고 싶은 경우도 있다.
이러한 사항은 Rust의 lint 도구인 Clipy를 사용하여 해결할 수 있습니다.
https://github.com/rust-lang/rust-clippy
clipy를 설치하면 dbg! 명령처럼 cargo check 명령을 사용할 수 있습니다.cargo clippy 매크로에 경고/오류가 표시되면 dbg! 레벨을 수정하여 표시할 수 있습니다.
https://rust-lang.github.io/rust-clippy/master/index.html#dbg_macro
설정 방법은 크게 2가지로 나뉘는데 Rust의 속성으로 설정하는 방법과 clippy::dbg_macro의 명령행 옵션으로 지정하는 방법이 있다.

  • 속성 지정cargo clippy 속성에서 경고가 발생했고 warn 속성에서 오류가 발생했습니다.
    main.rs
    #![warn(clippy::dbg_macro)] // 警告
    // #![deny(clippy::dbg_macro)] // エラー
    fn main() {
      dbg!();
    }
    
    deny의 결과(부분 발췌문)

  • 경고 시간
    warning: `dbg!` macro is intended as a debugging tool
    --> src/main.rs:4:5
    |
    4 |     dbg!();
    |     ^^^^^^
    |
    

  • 오류 시
    error: `dbg!` macro is intended as a debugging tool
    --> src/main.rs:4:5
    |
    4 |     dbg!();
    |     ^^^^^^
    |
    
  • Rust Playground
    여기에는 속성만 추가하면 쉬우나, 파일마다 검사할 수 있기 때문이다
    모든 원본 파일에 속성을 추가해야 합니다.
    규모가 큰 상황에서 명령행을 선택하는 것이 비교적 쉽다.

  • 명령줄 옵션에서 지정
    Giit의pre-commiit나CI 등을 사용하여 검사를 진행하면 지령선으로 지정하는 것이 편리하다.

  • 경고 표시
    cargo clippy -- -W clippy::dbg_macro
    

  • 오류 표시
    cargo clippy -- -D clippy::dbg_macro
    
  • 주의 사항으로 현지 등 이전에 실행cargo clippy한 경우
    명령줄 옵션이 반영되지 않기 때문에 미리 실행해야 합니다cargo clippy.
    Giit의pre-commiit의 한 예로 다음과 같다.
    #!/bin/bash -eu
    
    cargo clean && cargo clippy -- -D clippy::dbg_macro
    

    rust-analyzer와의 협력

    cargo clean 매크로는 LSP인 rust-analyzer를 사용하여 편리한 기능을 제공합니다.
    rust-analyzer는 다양한 편집기에서 사용할 수 있지만 이 글은 VScode를 사용합니다.

    dbg! 매크로 삽입


    Magic Compuletions 기능을 사용하면 매크로dbg!를 쉽게 삽입할 수 있습니다.
    https://rust-analyzer.github.io/manual.html#magic-completions

  • expr.dbg
    let x = 1;
    x.dbg💡
    
    💡 위치에 커서가 있는 상태에서 dbg! 키를 누르면 다음과 같이 변환할 수 있습니다.
    let x = 1;
    dbg!(x)
    

  • expr.dbgr
    let x = 1;
    x.dbgr💡
    
    💡 위치에 커서가 있는 상태에서 Tab 키를 누르면 다음과 같이 변환할 수 있습니다.
    let x = 1;
    dbg!(&x)
    
  • 탭 매크로 삭제

    dbg! 매크로에서 커서가 있는 상태dbg! 또는 편집기 왼쪽에 표시💡 아이콘을 클릭한 다음Ctrl + . 메뉴를 표시하고 메뉴를 클릭한 후Remove dbg!() 매크로를 삭제합니다.
        💡dbg!(1)
    
    실행dbg!하면Remove dbg!()매크로가 삭제됩니다.
        1
    

    이용 빈도


    rust-analyzer는 기본적으로 저장할 때dbg!를 실행하지만 설정을 변경해서 실행할 수 있습니다cargo check.
    VScode의 settings입니다.json의 설정 예.
    {
      // 保存時のコマンドをcargo checkから cargo clippyに変更します。
      "rust-analyzer.checkOnSave.command": "clippy",
      // 保存時のコマンドの引数を指定。ここではdbg!マクロ利用時に警告が出るようにします。
      "rust-analyzer.checkOnSave.extraArgs": ["--", "-W", "clippy::dbg-macro"],
    }
    

    좋은 웹페이지 즐겨찾기