【问题标题】:Are there ways getting sequence of executed statements in target C program?有没有办法在目标 C 程序中获取执行语句的序列?
【发布时间】:2012-12-27 06:27:52
【问题描述】:

我试图在执行程序之后在用 C 编写的目标程序中获取执行语句的序列,但我找不到方法。 我不需要在运行时获取执行语句的序列。 有没有办法做到这一点? 仅供参考,我知道 gcov 报告语句覆盖率,但据我所知,它不报告目标程序中执行语句的序列(我想获得执行语句的序列仅在目标程序源代码中) . 我正在使用 gcc 编译器在 Linux 中运行 C 程序 :)

为了您的清楚理解,请参见以下示例。

当我执行以下程序时,我想得到执行语句的序列,如下所示。

1: int main()
2: {
3:    int a  = 10;
4:    printf("hello");
5:    if( a == 10){
6:       printf("a == 0");
7:    }else{
8:       printf("a != 0");}
9:    return 0;
10: }

输出我想要得到的是:34569 (由于我要跟踪的目标程序在一行中只有一个语句, 行号序列作为输出对我来说就足够了)

几个小时前有人向其他人提出了这个问题(参见question),但没有明确答案的一些读者将其关闭。 如果它有众所周知的解决方案,请告诉我。

【问题讨论】:

  • 如果你两次问同样的问题,很可能会被关闭为重复。
  • 无法追踪已完成的程序。您需要在运行时 1) 通过使用跟踪工具或 2) 通过您自己的方式收集此信息。
  • 您在编辑器中看到的行号可能不是编译的实际行号。预处理器包括宏和所有其他幕后的东西肯定会“干扰”和“改变”你的行号。实际上,输出几乎没有用,绝对不值得生成它所需的黑客攻击。最好附加一个调试器并观察程序流程。
  • 源代码不执行。所以你不能得到这个信息。二进制执行。如果您将行号信息通过__LINE__ 放入二进制文件中,您将得到它。

标签: c sequence trace


【解决方案1】:

你可以使用LINE预处理宏来获取行号,

只需在每行后添加printf("%d", __LINE__);

【讨论】:

  • 这适用于大多数情况,但是需要手动添加;因为该行可能不是简单的语句行。例如你不应该在for(i=0;i<10;i++) 之后立即添加它
  • 感谢您的回复。但是还有其他方法可以自动完成吗?不幸的是,我知道这个,但这需要手动操作,如上面 anishsane 所述。我需要检测超过 10 个程序,其中一些程序包含超过 10000 行。
  • 我不确定,但是您可以尝试使用多处理,创建另一个可以获取行号并在控制台上打印的进程。虽然我不确定而且我现在有点忙于其他东西,但一旦有空就试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2021-01-31
  • 2022-01-24
  • 1970-01-01
  • 2011-09-27
  • 2013-12-07
相关资源
最近更新 更多