pp-trace是clang编译器前端的一个工具,主要作用有二:1)作为clangLex库的PPCallbacks机制的示例 2)作为一个工具,来dump出输出预处理器的所有活动。
在clang中,lexer只是处理同一个文件的所有字符,生成各个token,这个过程不涉及"语义",parser处理语法。另外lexer不知晓include文件,宏定义、宏展开,import等,这些工作是预处理器完成的。PPCallbacks是一个定义了很多徐函数的类,通过集成它,自定义相应的回调函数,可以hook与处理器的活动。
头文件:$(llvm-src-install)/tools/clang/include/clang/Lex/PPCallbacks.h
pp-trace作为一个工具,源代码目录:$(llvm-src-install)/tools/clang/tools/extra/pp-trace
代码不过非常简单。PPCallbacksTracker类集成PPCallbacks类,并实现徐函数;此类内部有一个std::vector的引用(对象声明在main函数中)。注意:这个PPCallbacksTracker是暂时性的,所以需要把hook过程中的信息存储在这个vector中。每一个CallbackCall对象内部有一个函数名字,多个key-value对(用于存储参数信息)。
pp-trace使用了libTooling,所以这个程序也可以作为一个学习libTooling的小例子。
命令示例
pp-trace t.c
pp-trace -ignore="FileChanged" ./t.c #忽略FileChanged类型的事件
阅读(2361) | 评论(0) | 转发(0) |