【问题标题】:c++ print executed codec++打印执行代码
【发布时间】:2013-12-11 18:16:10
【问题描述】:

有没有办法将正在执行的代码打印到文本文件中以用于调试目的?

例如:

if (i == 1)
{
 a = true;
}
else
{
 a = false
}

所以当 i = 1 我们打印到一个文本文件:

if (i == 1)
{
 a = true;
}
else

当 i != 1 我们打印到文本文件中

if (i == 1)
else
{
 a = false
}

我并不是说这是一个好习惯。我知道 gdb 和其他工具在调试代码方面要好得多,所以如果您认为这是一个糟糕的想法,请不要生气。我只是想知道它是否可以完成。这就像在每一行之后添加一个 printf,所以我们只打印被执行的行。没有线程保存或类似的东西。

【问题讨论】:

  • 您使用的是什么调试器/编译器?如果你有 Visual Studio 之类的东西,你可以编译 w/ 调试信息以获得与你想要的功能相似的功能。
  • 您可以使用运行 gdb 的脚本来完成。从编译器来看这是不可能的。
  • 不太可能;对于任何“真正的”程序,结果将是千兆(如果不是太字节)。
  • 我可以放心地说:没有问题,这是正确的解决方案。
  • 嗯,您可能真的在这里要求 XY 问题。请详细说明您的用例。正如我在回答中提到的,可以使用覆盖分析代码注入来分析执行的代码路径。运行特定的测试用例(输入选择)将为您提供详细的覆盖率报告,哪些代码路径的执行频率。

标签: c++ debugging printf


【解决方案1】:

我认为您想要的首先与调试无关,而是与单元测试和测试覆盖率有关:

您需要为您的代码创建单元测试(例如,使用 googletest)并在打开代码覆盖选项的情况下编译它(例如,--coverage 用于 GCC)。然后,您可以使用工具创建覆盖率报告(例如,lcov/genhtml 用于上述工具链)。

单元测试将控制案例的输入 (i = 1/0)。

【讨论】:

    【解决方案2】:

    出于调试目的,我会说这是不实用的。是的,您可以在每行执行之前/之后执行 printf,但这只会阻塞您的程序。此外,如果您正在谈论调试循环的执行,您最终会一遍又一遍地打印一堆垃圾,并且必须永远寻找潜在的错误。简而言之,使用断点。

    但是,从理论上讲,可以创建program that outputs itself。这与您想要的有点不同,因为您只需要程序的一部分,但我最好的猜测是稍加修改就可以完成。

    【讨论】:

    • 奎因与此无关。
    • 我以为原来的帖子是在问你是否可以或多或少地让程序自己输出?
    • “或多或少” - 这里少。它在执行时打印程序的行。
    • 我不同意。这种方法可能非常有用,尤其是当程序可以执行的路径很多时。有时要找到一个错误(或未实现的功能),需要删除许多开关、条件检查等......
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多