llvm学习(十九):CLion源码级调试clang

2018年,我问小花椒pass如何调试,椒哥告诉我他直接调试clang,用gdb,显然对于我这样的菜鸡来说太难了,但我一直没有到调试clang的地步,一直没管。2022年5月,想学习一个新特性被迫调试clang,记录一下这个过程。

环境准备

  • MacOS
  • CLion
  • llvm-project

操作步骤

本文参考:https://blog.csdn.net/qq_21746331/article/details/110198265

  1. 使用clion打开llvm-project/llvm

正如我们平时编译llvm,使用的也是llvm下的cmake。使用clion打开的是 llvm-project/llvm 、并不是 llvm-project 本身。

  1. 配置cmake编译选项

正如我们平时编译llvm,也给出合理的配置即可,为了调试,BuildType 选 ReleaseWithDebInfo,Generator选 Unix Makefiles,参数我喜欢这段 -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS=clang -DLLVM_TARGETS_TO_BUILD="X86"

  1. 寻找合适的 target 和 executable

llvm的cmake工程包括大量的target,每个target又包含很多个executable,我无法分辨哪个是编译 clang 这个可执行程序的最小集,随便选了如下的配置方式。这里肯定有更好的方案,只是我不知道。

  1. 点击运行按钮

点击运行后,开始进入漫长的 build 过程,我等待了数个小时才结束,看日志大概是先编译 clangBasic,再编译clang可执行文件。第二次运行就很快了,只需要一分钟。

每次点击运行都会触发完整的构建,但我们实际上并不需要它,根据官网的指导应该可以一次构建多次运行,https://www.jetbrains.com/help/clion/debug-arbitrary-executable.html ,但我懒得去测了,等一分钟而已。

  1. 点击debug按钮

直接调试,断点触发。

反思

我是一个脱离IDE就活不下去的轮椅人(轮椅人:指手残、不想学新东西、只想用版本强势装备无脑过图),这个方案不一定是最优雅的。如果让我重来一次,我可能会使用熟悉的命令行的方式来编译一个 clang,之后想办法使用 clion 直接调试该 binary,但可能遇到 td 文件没有被 tablegen 到 h 文件,Clion强大的索引功能坏掉,所以就不去踩这个坑了。

整个流程还是轻松的,为接下来的文章进行铺垫,接下来的才是重头戏。