gpt4 book ai didi

c - 如何让 gcc 吐出从流程图到源代码行号的映射

转载 作者:太空狗 更新时间:2023-10-29 16:47:16 25 4
gpt4 key购买 nike

gcc 能否在给定一个 C 文件的情况下吐出所有发生的函数调用的列表,以及调用本身和函数声明的文件名和行号?

我知道 gcc 以某种方式使用 -g 保留此信息(调试器依赖它)并且它可以使用 -dr 转储控制流图(但没有文件名或行号);但是是否有现成的工具可以获取 gcc 输出并执行我想要的操作?

我想要这样一个工具来使用 gcc 的原因是这将允许我将它与大多数基于 gcc 的软件附带的标准构建系统一起使用(例如 ./configure && make),即使在工具依赖于他们自己的预处理器和/或解析器很难适应。我已经知道几个这样的工具,例如标签。所以这个问题是question 525899的后续问题.

最佳答案

尝试 gcc 选项 -fdump-tree-fixupcfg-lineno

它将以一种可以使用相对简单的词法分析器或任何正则表达式引擎轻松解析的方式“ pretty-print ”解析 AST(带有行号)。只需找到所有以“=”开头并后跟“(”的非关键字 - 这将是函数调用。

所有复杂的表达式都将分成几行,因此一行中不会出现两个函数调用。

以简单的程序为例:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI (3.1415926536)

int main(int argc, char *argv[]) {
double angle = PI / 2.0;
printf("Sine = %lf, cosine = %lf\n", 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 = %lf\n"[0], D.3380, D.3379);
[test.c : 10] D.3381 = 0;
return D.3381;
# SUCC: EXIT

}

你不会得到任何复杂的表达式——只有赋值和函数调用,没有 CPP 宏,非常容易解析。循环和条件语句不会让它变得更加困难。

关于c - 如何让 gcc 吐出从流程图到源代码行号的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/697817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com