Clang Plugin 之 Debug

栏目: 编程工具 · IOS · 发布时间: 5年前

内容简介:前面一篇文章在得到正确结果的过程中,必不可少的一步就是在使用

前面一篇文章 LLVM & Clang 入门 讲了如何编写一个 Clang 插件,然后将插件编译成一个 .dylib 的动态链接库。集成到 Xcode 中就可以看到效果(正确的结果)。

在得到正确结果的过程中,必不可少的一步就是 Debug ,没有任何程序是一蹴而就的,除非你 printf 一个 "Hello, World!" ,说不定你的 world 还写成了 word

在使用 Plugin 的模式下我们是不能打断点进行 Debug 的,但是我们可以在代码中加日志,然后在终端中执行命令看日志进行 Debug。这种低效率(Low)的方式是你想要的吗?显然不是。

我们只需要把 .dylib 动态库变成 可执行文件 就能打断点 debug。LibTooling 或许是一个不错的选择。使用 LibTooling 的话,我们只需要改动很少部分的代码就可以。

LibTooling 简介:

LibTooling 是一个独立的库,它允许使用者很方便地搭建属于你自己的编译器前端工具,它基于 C++ 接口,提供给使用者强大全面的 AST 解析和控制能力,同时由于它与 Clang 的内核过于接近导致它的版本兼容能力比 libclang 差得多,Clang 的变动很容易影响到 LibTooling。libTooling 还提供了完整的参数解析方案,可以很方便的构建一个独立的命令行工具。

创建 LibTooling 项目及代码调整

为了方便,我们直接创建一个可执行的 LibTooling 项目,我们可以创建一个名为 QTPluginTooling 的项目。

  1. 创建过程跟 创建插件 步骤差不多,前面 3 步都是一样的,只需要把 QTPlugin 替换为 QTPluginTooling 就可以。

  2. 只是在第 4 步略有不同, QTPluginTooling 目录下的 CMakeLists.txt 的文件内容为

    set(LLVM_LINK_COMPONENTS
        Support
    )
    
    add_clang_executable(QTPluginTooling
        QTPluginTooling.cpp
    )
    
    target_link_libraries(QTPluginTooling
        PRIVATE
        clangAST
        clangBasic
        clangDriver
        clangFormat
        clangLex
        clangParse
        clangSema
        clangFrontend
        clangTooling
        clangToolingCore
        clangRewrite
        clangRewriteFrontend
    )
    
    if (UNIX)
        set(CLANGXX__LING_OR_COPY create_symlink)
    else()
        set(CLANGXX_LINK_OR_COPY copy)
    endif()
    复制代码
    Clang Plugin 之 Debug
  3. llvm_xcode 目录下执行 $ cmake -G Xcode ../llvm ,重新生成一下 Xcode 项目。 Tooling 项目在 Xcode 的 Clang executables 目录下可以找到。

    Clang Plugin 之 Debug
  4. 将之前 Plugin 的代码复制过来,新增三个头文件

    #include "clang/Tooling/CommonOptionsParser.h"
    #include "clang/Frontend/FrontendActions.h"
    #include "clang/Tooling/Tooling.h"
    复制代码
  5. 新增一个命名空间

    using namespace clang::tooling;
    复制代码
  6. QTASTAction 的继承改为继承至 ASTFrontendAction

  7. FrontendPluginRegistry 注册插件的方式注释。更改为 main() 函数方式

    static llvm::cl::OptionCategory OptsCategory("QTPlugin");
    int main(int argc, const char **argv) {
        CommonOptionsParser op(argc, argv, OptsCategory);
        ClangTool Tool(op.getCompilations(), op.getSourcePathList());
        return Tool.run(newFrontendActionFactory<QTPlugin::QTASTAction>().get());
    }
    复制代码

最后整个文件的内容可以在 QTPluginTooling.cpp 看到。

输入源

如果这时候就 run 的话则会直接退出。这是因为没有“输入源”。我们可以在 QTPluginToolingScheme 加入。

/Users/laiyoung_/Desktop/Plugin/ViewController.m
--
-isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
-isystem
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.0/include
-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include
-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks
复制代码
Clang Plugin 之 Debug

参数解释:

上面在 -- 后面的参数,是传递给 CICompilation DataBase 的,而不是这个命令行 工具 本身的。比如我们的 ViewController.m ,因为有 #import <UIKit/UIKit.h> 这么一条语句,以及继承了 UIViewController ,那么语法分析器(Sema)读到这里的时候就需要知道 UIViewController 的定义是从哪里来的,换句话说就是它需要找到定义 UIViewController 的地方。怎么找呢?通过指定的 -I-F 这些参数指定的目录来寻找。 -- 后面的参数,可以理解为如果你要编译 ViewController.m 需要什么参数,那么这个后面就要传递什么参数给我们的 QTPlugin ,否则就会看到 Console 里打出找不到 xxx 定义或者 xxx.h 文件的错误。当然因为一般的编译指令,会有 -c 参数指定源文件,但是 -- 后面并不需要,因为我们在 -- 前面就指定了。 -- 这种传参的方式还有另外一种方法,使用 -extra-arg="xxxx" 的方式指定编译参数,这样就不需要 -- 了。

-extra-arg="-Ixxxxxx"
-extra-arg="-Fxxxxxx"
-extra-arg="-isysroot xxxxxx"
xxxxxx表示的路径
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Practice of Programming

The Practice of Programming

Brian W. Kernighan、Rob Pike / Addison-Wesley / 1999-2-14 / USD 49.99

With the same insight and authority that made their book The Unix Programming Environment a classic, Brian Kernighan and Rob Pike have written The Practice of Programming to help make individual progr......一起来看看 《The Practice of Programming》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具