Rust의 dbg!매크로 정보
dbg! 매크로
Rust1.32.0stable에 추가된 매크로입니다.
이름과 같이 디버깅에 편리한 매크로입니다.
공식 및 결과를 표준 오류로 출력합니다.
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를 사용하여 해결할 수 있습니다.
clipy를 설치하면
dbg!
명령처럼 cargo check
명령을 사용할 수 있습니다.cargo clippy
매크로에 경고/오류가 표시되면 dbg!
레벨을 수정하여 표시할 수 있습니다.설정 방법은 크게 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!();
| ^^^^^^
|
여기에는 속성만 추가하면 쉬우나, 파일마다 검사할 수 있기 때문이다
모든 원본 파일에 속성을 추가해야 합니다.
규모가 큰 상황에서 명령행을 선택하는 것이 비교적 쉽다.
명령줄 옵션에서 지정
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!
를 쉽게 삽입할 수 있습니다.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"],
}
Reference
이 문제에 관하여(Rust의 dbg!매크로 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/masinc/articles/rust-macro-dbg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)