1. 构建LLVM

获取源码

  1. git clone --depth 1 https://github.com/llvm/llvm-project.git

配置和构建LLVM和Clang

进入终端执行

  1. echo 'export OSX_COMMANDLINE_SDKROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"' >> ~/.zshrc

然后执行

  1. source ~/.zshrc

使⽤ brew 安装 cmake

  1. brew install cmake

开始构建

开始电脑性能检测,电脑寿命缩短构建:
1. cd llvm-project
2. mkdir build
3. cd build
4. cmake -G [options] ../llvm

  1. cmake -G Xcode -j 6 -DLLVM_ENABLE_PROJECTS='libcxx;libc++;clang;lldb' -DLLDB_USE_SYSTEM_DEBUGSERVER=ON -DLLDB_TEST_COMPILER=clang++ -DCMAKE_OSX_SYSROOT=$OSX_COMMANDLINE_SDKROOT ../llvm

Xcode 相关配置

进⼊到 build ⽬录下,打开 LLVM.xcodeproj ,选择【Manually Manage Schemes】

注意⚠ ⚠ ⚠ : 不要选择 Automatically Create Schemes 。选择 Manually Manage Schemes

image.png
然后,Product -> Scheme -> Manage Schemes,在 Target 中选择 lldb 可执⾏⽂件

image.png
然后编译源码,当显示⿊⾊的 (lldb) 字样,编译成功啦:

2. 通过LLVM 调试命令 -nm

添加llvm-nm的Scheme:
Product -> Scheme -> Manage Schemes
image.png

锁定llvm-nm的源码,在main函数中断点

定位llvm-nm的Target,找Build Phases,自llvm-nm.cpp的main函数中断点
image.png

给llvm -nm 的main函数传参数

image.png

3.通过LLVM编译调试strip

1) 打开LLVM.xcodeproj工程,在 Target中搜索strip ,找到 llvm-strip ,这是一个脚本

image.png

2) 创建一个Scheme,(Product -> Scheme -> Manage Schemes —-> 在弹出界面中点击左下角”+”),选择llvm-strip 的Target

image.png

3) 编译llvm-strip, 并在Target中找到 llvm-objcopy,拷贝创建 llvm-objcopy的副本target ,改名为 strip

image.png

4) 创建一个 strip的Scheme ,指定其 Target为strip ,编译strip

image.png

5)找到strip编译的源文件 llvm-objcopy.cpp ,在llvm-objcopy.cpp的main函数中断点

image.png

6)从文件中 读取断点信息

  • 拷贝 断点信息的文件路径 :/Users/mac/Desktop/strip_lldb.m
  • 直接运行strip(Product->Perform Action -> Run Without Building),断点在main函数中断住
  • 在Xcode的调试终端中输入命令
    1. br read -f /Users/mac/Desktop/strip_lldb.m
    image.png

7) 断点默认是没有开启的,将断点放入strip组里( Xcode的终端中输入 br list strip ),开启组里的断点( br enable strip )

image.png
image.png

8) 给strip传参

image.png
第一个参数:

  • -x : non_global
  • 无参数: 代表全部符号
  • -S : 剥离调试符号

第二个参数:需要脱符号的可执行文件路径

9) 导出手动在代码中下的断点

在某个断点处断住,在Xcode终端中输入 br write -f PATH