# How to MLIR Debug ## Debugモード LLDBを使ってデバッグをする場合は、LLVMをデバッグする時はcmakeのbuild optionにDebugを指定する。 ``` -DCMAKE_BUILD_TYPE=Debug ``` ただし、Debugモードはbuild時間を長くしてしまうため、LLDBを特に利用しない場合はReleaseを指定したほうがいい。 多くのケースでは以下で記述しているprintデバッグの方法で事足りるから。 ``` -DCMAKE_BUILD_TYPE=Release ``` ## Configuration Sample ```bash cmake -G Ninja ../llvm \ -DLLVM_ENABLE_PROJECTS=mlir \ -DLLVM_TARGETS_TO_BUILD="X86" \ -DCMAKE_BUILD_TYPE=Debug \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_LLD=ON ``` ## Op printデバッグ MLIRでのデバッグの場合、llvm::errs()よりもOperatorのemit{hoge}を利用すると視覚的にも良いデバッグ結果を得ることができる。 ```cpp op.emitWarning() << "HERE: " << myVariable; ``` stacktraceを得るには `-mlir-print-stacktrace-on-diagnostic` を mlir-optにつけて実行する。 - https://mlir.llvm.org/getting_started/Debugging ## LLDBデバッグ MLIRの内部処理を追っていく時にLLDBを使うと便利。 1. ターミナルを開き、lldbコマンドを実行 ``` $ lldb ``` 2. デバッグ対象のプログラムをlldbで開く ``` (lldb) target create /path/to/your/program ``` 3. ブレークポイントを設定する - 行番号に基づくブレークポイントの設定: ``` (lldb) breakpoint set --file yourfile.cpp --line 10 ``` - 関数名に基づくブレークポイントの設定: ``` (lldb) breakpoint set --name your_function ``` - クラスのメソッドに基づくブレークポイントの設定: ``` (lldb) breakpoint set --method your_class::your_method ``` 4. プログラムの実行を開始 ``` (lldb) run <arg1> <arg2> .. ``` 5. プログラムがブレークポイントで停止すると、lldbプロンプトが表示される。この時点で、変数の値やスタックトレースなどの情報を確認できる。 6. 解析したい情報を取得するために、lldbのコマンドを使用する - 変数の値を表示する: ``` (lldb) print your_variable ``` - スタックトレースを表示する: ``` (lldb) bt ``` - ステップ実行する: ``` (lldb) next ``` - プログラムを続行する: ``` (lldb) continue ``` - ブレークポイントを削除する: ``` (lldb) breakpoint delete your_breakpoint_number ``` - lldbを終了する: ``` (lldb) quit ``` ### LLDB Reference - https://lldb.llvm.org/use/tutorial.html - [LLDBを使ってCのデバッグをする ](https://qiita.com/edo_m18/items/9b6be35907433e1c743e#%E5%A4%89%E6%95%B0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B) - [GDB to LLDB Command Map](https://lldb.llvm.org/use/map.html) ## その他参考 - https://llvm.org/docs/ProgrammersManual.html#the-llvm-debug-macro-and-debug-option - https://llvm.org/docs/SourceLevelDebugging.html#c-c-source-file-information - [EVERYTHING I KNOW ABOUT DEBUGGING LLVM](https://clangbuiltlinux.github.io/llvm-dev-conf-2020/nick/debugging_llvm.html#/)(おすすめ) - [LLVM Debugging Tips and Tricks](https://bholt.org/posts/llvm-debugging.html) - [Debug Info Tutorial](https://llvm.org/devmtg/2014-10/Slides/Christopher-DebugInfoTutorial.pdf) - [Debugging of optimized code](https://llvm.org/devmtg/2017-10/slides/Pieb-Debugging%20of%20optimized%20code.pdf)