在给定C文件的情况下,gcc可以吐出所有函数调用的列表,文件名和行号都用于调用本身和函数声明吗?
我知道gcc不知何故用-g(调试器依赖它)保留这些信息,并且它可以使用-dr转储控制流图(但没有文件名或行号); 但是有一个现成的工具,需要gcc输出并做我想要的吗?
我希望这样一个工具使用gcc的原因是,这将允许我将它与大多数基于gcc的软件一起使用的标准构建系统一起使用(例如./configure && make),即使在依赖于他们自己的预处理器的工具的情况下也是如此和/或解析器是一个很大的麻烦。我已经知道了几个这样的工具,例如ctags。 所以这个问题是问题525899的后续问题 。
尝试gcc选项-fdump-tree-fixupcfg-lineno
。
它将“漂亮地打印”解析AST(带行号)的方式可以使用相对简单的词法分析器或任何正则表达式引擎轻松解析。 只需找到前面带有’=’的所有非关键字,然后是’(’ – 它将是函数调用。
所有复杂的表达式将被分成几行,因此一行上不会出现两个函数调用。
采取简单的程序:
#include #include #include #define PI (3.1415926536) int main(int argc, char *argv[]) { double angle = PI / 2.0; printf("Sine = %lf, cosine = %lfn", sin(angle), cos(angle)); return EXIT_SUCCESS; }
用-fdump-tree-fixupcfg-lineno
编译它,你得到这样的东西:
main (argc, argv) { double angle; int D.3381; double D.3380; double D.3379; # BLOCK 2, starting at line 8 # PRED: ENTRY (fallthru) [test.c : 8] angle = 1.57079632680000003119857865385711193084716796875e+0; [test.c : 9] D.3379 = [test.c : 9] cos (angle); [test.c : 9] D.3380 = [test.c : 9] sin (angle); [test.c : 9] printf (&"Sine = %lf, cosine = %lfn"[0], D.3380, D.3379); [test.c : 10] D.3381 = 0; return D.3381; # SUCC: EXIT }
你不会得到任何复杂的表达式 – 只是赋值和函数调用而且没有CPP宏,非常容易解析。 循环和条件不会让事情变得更加困难。
Valgrind和KCacheGrind似乎是这个用途的好工具:
valgrind --tool=callgrind --dump-instr=yes ./your_binary
这将为您提供一个名为callgrind.out.pid的文件,您可以使用KCacheGrind打开该文件。 这将让你看到许多信息,如调用图,文件名…
您可以尝试使用Treehydra ,这是一个GCC插件,可以在编译期间为您提供对GCC内部代码表示的只读访问权限。 (但是,构建它有点苦差事,而且我不确定它会为这个问题提供比-fdump- *更好的结果。)
需要了解更多c/c++开发分享如何让gcc吐出从流图到源代码行号的映射,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何让gcc吐出从流图到源代码行号的映射相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979777.html