Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

MIR 디버깅

-Z dump-mir 플래그를 사용하면 MIR의 텍스트 표현을 덤프할 수 있습니다. -Z dump-mir와 함께 사용하는 다음 선택적 플래그를 쓰면 추가 출력 형식을 사용할 수 있으며, 그 예는 다음과 같습니다:

  • -Z dump-mir-graphviz - MIR을 제어 흐름 그래프로 나타내는 .dot 파일을 덤프합니다
  • -Z dump-mir-dataflow - 제어 흐름 그래프의 각 지점에서의 데이터 흐름 상태를 보여 주는 .dot 파일을 덤프합니다

-Z dump-mir=F는 컴파일의 각 단계에서 각 함수의 MIR을 볼 수 있게 해 주는 편리한 컴파일러 옵션입니다. -Z dump-mir는 필터 F를 받으며, 이 필터로 관심 있는 함수와 패스를 지정할 수 있습니다. 예를 들면 다음과 같습니다.

> rustc -Z dump-mir=foo ...

이렇게 하면 이름에 foo가 포함된 모든 함수의 MIR을 덤프하며, 모든 패스의 전과 후 MIR을 모두 덤프합니다. 해당 파일은 mir_dump 디렉터리에 생성됩니다. 아마 파일이 꽤 많이 생길 것입니다!

> cat > foo.rs
fn main() {
    println!("Hello, world!");
}
^D
> rustc -Z dump-mir=main foo.rs
> ls mir_dump/* | wc -l
     161

파일 이름은 rustc.main.000-000.CleanEndRegions.after.mir와 같은 형태입니다. 이 이름은 여러 부분으로 구성됩니다:

rustc.main.000-000.CleanEndRegions.after.mir
      ---- --- --- --------------- ----- either before or after
      |    |   |   name of the pass
      |    |   index of dump within the pass (usually 0, but some passes dump intermediate states)
      |    index of the pass
      def-path to the function etc being dumped

더 선별적인 필터를 만들 수도 있습니다. 예를 들어 main & CleanEndRegions는 main과 CleanEndRegions 패스를 모두 참조하는 항목을 선택합니다:

> rustc -Z dump-mir='main & CleanEndRegions' foo.rs
> ls mir_dump
rustc.main.000-000.CleanEndRegions.after.mir	rustc.main.000-000.CleanEndRegions.before.mir

필터에 | 부분을 넣어 여러 &-필터 집합을 결합할 수도 있습니다. 예를 들어 main & CleanEndRegions | main & NoLandingPads는 main과 CleanEndRegions 또는 main과 NoLandingPads 중 하나를 선택합니다:

> rustc -Z dump-mir='main & CleanEndRegions | main & NoLandingPads' foo.rs
> ls mir_dump
rustc.main-promoted[0].002-000.NoLandingPads.after.mir
rustc.main-promoted[0].002-000.NoLandingPads.before.mir
rustc.main-promoted[0].002-006.NoLandingPads.after.mir
rustc.main-promoted[0].002-006.NoLandingPads.before.mir
rustc.main-promoted[1].002-000.NoLandingPads.after.mir
rustc.main-promoted[1].002-000.NoLandingPads.before.mir
rustc.main-promoted[1].002-006.NoLandingPads.after.mir
rustc.main-promoted[1].002-006.NoLandingPads.before.mir
rustc.main.000-000.CleanEndRegions.after.mir
rustc.main.000-000.CleanEndRegions.before.mir
rustc.main.002-000.NoLandingPads.after.mir
rustc.main.002-000.NoLandingPads.before.mir
rustc.main.002-006.NoLandingPads.after.mir
rustc.main.002-006.NoLandingPads.before.mir

(여기서 main-promoted[0] 파일은 main 함수 안에 나타난 “승격된 상수(promoted constants)“의 MIR을 가리킵니다.)

-Z unpretty=mir-cfg 플래그를 사용하면 크레이트 전체에 대한 graphviz MIR 제어 흐름 다이어그램을 만들 수 있습니다:

TODO: 그 밖에 추가할 내용이 있습니까?