首页
学习
活动
专区
圈层
工具
发布

ASTMatcher分析函数调用链(上)

3、ASTMatcher ASTMatcher:我们在写clang插件过程中,最大的痛点是在AST阶段快速找到自己想要的节点,RecursiveASTVisitor的方式需要递归遍历、逐层查找,不仅代码冗余...而clang的ASTMatcher,速度快,可以让我们高效的匹配到我们想要的节点;其内部可以嵌套多个ASTMatcher,通过调用构造函数创建,或者构建成一个ASTMatchers的树,使得匹配更加具体准确...这里创建函数调用的ASTMatcher的策略如下: (1)寻找想匹配的节点最外层的类:函数调用 (2)在 AST Matcher Reference 中查看所需要的Matcher匹配到需要的节点:objcMessageExpr...5、使用ASTMatcher 文件中若import其他文件,ASTMatcher是分析不到的,这时你必须告诉ASTMatcher你import的文件来自哪里,所以被分析文件import的文件的目录必须通过参数...很重要的一点是多了解AST Matcher Reference里提供的Matchers,配合clang-query快递验证匹配器的正确性,并且要多熟悉每个节点的使用。

7.9K81

Java中构造函数、setget方法和toString方法的使用及注意事项

参考链接: 可以重写Java中的私有方法吗 一、构造函数 构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化。...:alt+insert,Constructor(构造函数) 这就说明在我们创建Test01对象时,会自动调用构造函数完成初始化,这时程序中的name属性就成了Wade。...上面说到构造函数是为了在new对象传入参数后完成属性的初始化。但是 ,为什么我程序中不写构造函数依然可以完成初始化。 1.如果不写构造函数,程序会自动生成一个无参数无操作的构造函数(默认的,隐藏)。...3.如果只写了有参数的构造函数,且不存在无参数的构造函数,将不能以 new XXX(); 这样的方式实例化对象,在实例化对象代码中,new XXX("***"); 括号中的参数必须与构造函数的参数保持一致...所以,比较稳妥也是较常用的方式是在java类中同时定义无参构造函数和有参构造函数,代码如下: public class Test01 {     private String name;     //有参构造函数

2.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    小心两个共享库共用同一个静态库

    下载测试代码: x.zip(和帖子的略不同,x.zip包中的全局变量是个类对象,带有构造和析构函数) 推荐阅读:http://blog.chinaunix.net/uid-20682147-id-351108....html(Linux上制作可执行的共享库示例) 问1:如果测试中的全局变量global_var是个带构造和析构的类对象,会如何?...,所以程序仍然可以找到正确的入口地址或者常量。...原因是在使用dlopen动态加载共享库时,如果静态库中包含有全局变量,可能会出现名同地址不同的全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享库,而不是RTLD_LOCAL。...比如程序的公司名、发布版本号等 .line 调试时的行号表,即源代码行号与编译后指令的对应表 .hash 符号哈希表 .dynamic 动态链接信息 .debug 调试信息 .comment

    3.1K50

    Linux常见工具使用

    add.o g++ -o @ ^ 作用:使用g++将.o文件链接成最终可执行文件myapp 解释: @:代表当前规则中的目标文件,这里是(BIN)^:代表所有的依赖文件(去除重复的),这里是(OBJ....o文件 g++ -c &< -o $@ 作用:使用g++将.cpp文件编译成.o文件 解释: 中的第一个依赖文件,在这里就是 .cpp 文件 清理目标部分 .PHONY: clean...【退出】 ctrl+d或quit调试命令 【常见命令】 list/l:列出源代码,从上次位置开始,每次列10行 list/l 函数名:列出指定函数的源代码 list/l 文件名:行号:列出指定文件的源代码...until x:执行到指定行号 backtrace/bc:查看当前执行栈的各级函数调用及参数 info/i locals:查看当前栈帧的局部变量值 vim的使用 vim是一种多模式编辑器...底行模式操作 进入底行模式之前,先按esc键确定在命令模式下,再按:进入第行模式 列出行号 set nu:输入set nu,会在文件中每一行前面列出行号 set nonu:取消行号 查找

    11810

    log4cpp深度封装

    主要是对于log4cpp的使用如果不封装一下,感觉还是挺麻烦的,例如不少函数名挺长的。所以自己动手把它的日常使用进行了封装,可以让使用log4cpp就像调用一句printf()函数一样简单快捷。...封装目标 不需要用一次就调用一次getInstance,只需要在main文件中引入一次即可 封装成需要使用时只需简短的一举logError(“somelog”) 就搞定 输出的日志内容包含:文件名,函数名...,行号(通过以上函数调用即可) 利用单例模式封装 具体实现 类定义 & 宏定义 巧妙的使用宏定义可以缩短函数调用形式(虽然effective c++ 和google C++编程规范都极力反对使用太多宏)...********************************* //注意: //文件名 __FILE__ ,函数名 __func__ ,行号__LINE__ 是编译器实现的 //并非C++头文件中定义的...getInstance语句 //只需要在主函数文件中写: #define _LOG4CPP_即可在整个程序中使用 #ifdef _LOG4CPP_ Mylog &log = Mylog::getInstance

    1.1K30

    两个简单例子学会使用Java中的Enum实例1实例2(带构造函数)什么时候使用Enum

    一个enum就像其他的类一样,可以拥有一系列的实例。 下面我们会举几个简单的例子说明如何使用Java中的enum。...Paste_Image.png 实例2(带构造函数) package Enum; public class Test { public static void main(String[] args...Enum 我们知道Java中的enum的定义是像其他类一样,只是多了一系列预定义的实例。...一个适合的使用场景是:防止不可用参数,例如下面这个例子: public void doSomethingWithColor(int color); 我们在使用函数的时候发现这个参数是很模糊的,我们不知道不同的颜色对应什么...int值,所以传错参数,但我们如果使用enum,就可以使其变得简单易读: public void doSomethingWithColor(Color color); 根据我们上面定义的enum color

    84020

    Linux下GDB调试指令总结

    until+行号:运行至某行,不仅仅用来跳出循环 finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。...call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55) quit(简写q) : 退出gdb 02 设置断点: break n (简写b n):在第n行处设置断点...(可以带上代码路径和代码名称:b OAGUPDATE.cpp:578) b fn1 if a>b:条件断点设置 break func(break缩写为b):在函数func()的入口处设置断点,如:break...breakpoints) :显示当前程序的断点设置情况 delete breakpoints:清除所有断点: 03 查看源代码: list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10...list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list

    5.1K20

    调试HotSpot源代码(配视频)

    1、GDB调试源代码 在Linux上常用GDB调试C/C++源代码。使用GDB运行如上实例生成的Class文件,具体命令如下: gdb --args ....查看当前栈帧局部变量的值 list(l) 列出源代码,接着上次的位置往下列,每次列10行ll list(l) 行号 列出从指定行开始的源代码 list(l) 函数名 列出指定的函数的源代码 next(...n) 执行下一行语句 print(p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数 quit(q) 退出gdb调试环境 step(s) 执行下一行语句,如果有函数调用则进入到函数中 start...开始执行程序,停在main函数第一行语句前面等待命令 break(b) 行号 在指定行设置断点 break 函数名 在指定函数的开头设置断点 break … if … 设置条件断点 continue(...可以在hotspot/src/share/vm/prims/jni.cpp文件下的JNI_CreateJavaVM()函数上打个断点,然后在run(Ctrl+Shift+D)选项栏中选中”HotSpot

    1.8K40

    【GDB调试技巧】提高gdb的调试效率

    使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。...如: 对于.c文件: gcc -g -o hello hello.c 对于.cpp文件: g++ -g -o hello hello.cpp 启动GDB的方法有以下几种: gdb program program...即 tree3_01.c 文件中第 53 行代码在程序运行时的地址范围,从 main 函数的偏移量为 41 的位置开始,到 main 函数的偏移量为 53 的位置结束。...也可以指定行号或者函数名作为参数,以显示特定位置的源代码。 list: 显示当前执行位置周围的源代码。 list function_name: 显示名为 function_name 的函数的源代码。...list line_number: 显示指定行号的源代码。 3.2 方式二:f 在过程中,f 命令的功能是帮助了解当前执行的代码所在的位置,特别是在调试过程中出现错误时,可以帮助确认错误发生的地点。

    68510

    企业微信 iOS 工程演进之路(一)- 组件化

    缺点是方案不够通用,如果要解析整个工程组件间依赖关系,需要构造大量的子工程,且结论要编译、链接完成后才能得到,效率很低;同时该方案得到的结论粒度不够细,只能精确到符号,没有符号所属源码文件、行号列号等信息...我们可以基于它的 ASTMatcher 编写工具解析源码,得到函数定义、函数调用等信息,从中可以分析出组件的依赖关系。...,接下来就是编写工具完成解析工作,工具解析流程如下:使用 ASTMatcher 编写 Matchers 从 AST 中匹配我们需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表...图片最终每个组件会生成两个表格,对外暴露符号和外部依赖符号,如下图所示,表格中包含符号定义的文件路径、行号、列号,使用符号的文件路径、行号、列号,以及符号的定义代码、使用符号的代码等信息。...但是企微在集成会议、邮箱、文档插件时,插件侧要进行深度的业务融合和定制化开发,插件开发同事需要使用企微的账号体系、数据进行调试,很难构造一个 Demo 工程模拟联调环境。

    1.9K31

    我的VS2010+VAssistX

    ,却占用了一整行的屏幕空间,如果你想知道现在的行号,你可以打开行号显示或者按CTRL+G,(还可以直接定位哦,真TMD值), 3 有了VAX可以关掉C++导航栏,因为VSS有,而且功能更强大,快捷键ALT...,用得不多,但很实用(改过名的都知道) 8    alt+o,在.h与.cpp文件中实现相互转换 9    alt+g,函数声明定位,比VS的还要强大 一般我还会打开vax options->advanced...(第一次发文,希望不要太糟糕) Alt + O: 在对应的cpp和h文件切换,除后缀名之外文件名必须一致 Shift + Alt + O: 打开一个窗口,根据输入的字符来匹配源文件名,从而快速打开一个源代码文件...Alt + M:列出当前文件的所有函数。在文件编辑窗口的上部有一个ListBox,里面包含了当前文件里的所有的函数。用这个快捷方式可以快速下拉这个窗口,然后可以输入部分函数名称来快速定位到一个函数。...这个功能的一个使用是当你的cpp文件包含了很多个h文件,你可以选中所有的头文件,然后排序,这样就很容易维护这个h文件列表了.

    96410

    Linux命令(63)——nm令

    A 该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。...U 该符号在当前文件中是未定义的,即该符号定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,这个被调用的函数在当前文件就是未定义的,但是在定义它的文件中类型是T。...-g|--extern-only:仅显示外部符号 -h|--help:显示帮助信息 -l|--line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。...对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。...如果可以找到行号信息,显示在符号信息之后 -n|-v|--numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序 -P|--portability:使用POSIX.2标准输出格式代替默认的输出格式

    6K00

    从崩溃转储到根本原因:Windows平台WinDbg分析指南

    WinDbg擅长根据转储中存在的模块,自动从微软的公共符号服务器或您自己的私有符号存储下载正确的符号文件。这将原始内存地址映射到有意义的函数名、变量名和源代码行号。...这对于找到崩溃的根本原因(哪个函数调用了有问题的函数?)或理解挂起中的逻辑路径(线程卡在哪里等待?)是绝对必要的。查看数据(参数和局部变量):正确的符号包含有关函数参数和局部变量的信息。...连接到代码(源代码行映射):当可用时(通常在带有源索引构建的私有符号中),符号将执行代码地址链接回原始源文件和行号。...它们还可能包含对源服务器索引的引用,允许WinDbg在配置后获取相应的源代码版本。通常缺少的内容:局部变量的名称、详细的类型信息(如结构体或类的布局)以及函数内的确切源代码行号。...使用私有符号: - 我们看到源文件名和行号(processor.cpp @ 155)。 - 函数参数(pRecord,recordId)被正确识别,并显示了它们的值。

    60120

    linux装载和启动可执行程序的过程

    :gcc -E -o hello.cpp hello.c -m32 (源代码) 将所有的#define删除,并且展开所有的宏定义 处理所有的条件预编译指令,比如#if #ifdef #elif #else...添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号 保留所有的#pragma编译器指令,因为编译器需要使用它们 编译:gcc -x cpp-output -S -o hello.s hello.cpp...,定义如下:GOT[2] = &_dl_runtime_resolve,这个函数的主要作用就是找到某个符号的地址,并把它写到与此符号相关的GOT项中 PLT表   Procedure Linkage Table...pushl n的地址,实际上就是顺序执行下一步 (3)执行pushl n,n为puts函数地址在GOT表中的位置,向堆栈中压入这个偏移量的主要作用就是为了找到puts函数的符号名以及puts函数地址在...函数,该函数会找到puts函数的实际加载地址,并把它写到GOT表中,返回时就会进入puts函数内执行。

    3.5K40

    rg 搜索中的 -n是什么意思?

    在ripgrep(简称rg)命令中,-n选项表示“显示行号”(--line-number)。它的作用是在输出结果的每一行匹配内容前面,标注该内容在原始文件中的具体行数。...ripgrep:GUIDE.md-Fossies反向操作:如果你想在终端中关闭行号,可以使用-N或--no-line-number。...ripgrep15.1.0-Docs.rs命令解析:在你提供的命令rg-n"wep_key|wep_tx_keyidx"sta_network.cpp中,rg会在sta_network.cpp文件中搜索包含...在处理大型源代码文件(如sta_network.cpp)时,知道匹配项的具体位置对于快速定位代码至关重要。...实用建议快速定位:如果你使用的是支持点击链接的终端(如VSCode终端或iTerm2),带有行号的输出通常可以直接点击跳转到对应文件的对应行。

    10010

    企业微信零耦合集成腾讯会议和腾讯文档插件化架构实践

    缺点是方案不够通用,如果要解析整个工程组件间依赖关系,需要构造大量的子工程,且结论要编译、链接完成后才能得到,效率很低;同时该方案得到的结论粒度不够细,只能精确到符号,没有符号所属源码文件、行号列号等信息...企微团队可以基于它的 ASTMatcher 编写工具解析源码,得到函数定义、函数调用等信息,从中可以分析出组件的依赖关系。...工具解析流程如下:首先,使用 ASTMatcher 编写 Matchers 从 AST 中匹配企微团队需要的节点,提取出每个文件的函数定义/调用、变量定义/调用、类定义/引用列表,列表中还包含每个符号的代码文本...最终每个组件会生成两个表格,对外暴露符号和外部依赖符号,如下图所示,表格中包含符号定义的文件路径、行号、列号,使用符号的文件路径、行号、列号,以及符号的定义代码、使用符号的代码等信息。...但是企微在集成会议、邮箱、文档插件时,插件侧要进行深度的业务融合和定制化开发,插件开发同事需要使用企微的账号体系、数据进行调试,很难构造一个 Demo 工程模拟联调环境。

    1.9K80

    01.C++基础语法

    调试信息是嵌入在可执行文件中的额外数据,它建立了机器代码与源代码之间的映射关系,使调试器能够:源代码映射:将汇编指令对应到源代码行号变量跟踪:识别内存位置对应的变量名符号表:保存函数名、类名、变量名等符号信息数据类型...:记录变量和结构体的类型信息调用栈:支持函数调用栈的追踪调试信息包含的关键内容信息类型作用示例行号信息将机器指令映射到源代码行0x401530 → main.cpp:15符号表函数/变量名到内存地址的映射...这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。解决办法:因此,引入了命名空间这个概念,可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。...、函数、变量的声明,具体实现放在 .cpp 文件中。...explicit:禁止构造函数的隐式转换(C++11 引入)。noexcept:表示函数不会抛出异常(C++11 引入)。

    30710

    C++ gcc编译过程

    如下图所示: 第一步:预处理 将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。...·删除所有的注释//和 /**/; ·添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息; ·保留所有的#pragma...注意这里的cpp命令不是C plus plus 而是C Preprocessor。.ii文件实际上是编译器要处理的文件。文件内容包括.h头文件和.cpp源代码文件中的所有内容。...生成预处理文件的方式有三种。 1.使用cpp 命令执行预编译。将输出内容转移到文件中的方式。此处 > 符号表示输出到文件。 执行命令后,查看目录中的文件信息。...然后我们使用 del *.ii 的方式删除生成的预处理 .ii 文件. 2.使用cpp 的-o 参数指定输出文件名 。-E 参数指定输入文件名。 执行命令后,查看目录中的文件信息。

    5.7K10
    领券