【问题标题】:Is it possible to know which lines of the source code were executed?是否有可能知道源代码的哪些行被执行了?
【发布时间】:2010-09-21 17:22:40
【问题描述】:

我正在使用 Visual Studio 调试 C/C++ 代码。有一个称为 10000 次的循环,在其中一次交互中,在循环结束时出现错误,因为程序试图访问长度为 N 的数组的 N+1 值。我想回去调试错误的根源,我想知道 Visual Studio 在调试模式下是否可以以视觉方式突出显示或告诉我执行了哪些源代码行。然后更容易找到错误。有人知道这是否可能吗?

如果 VS 无法做到这一点,还有哪些其他方法可以做到这一点?

谢谢

编辑:我也想知道这是否可以使用任何其他 IDE(Eclipse、Xcode、命令行等)来完成

【问题讨论】:

    标签: c visual-studio code-coverage


    【解决方案1】:

    在数组访问发生的地方放置一个条件断点。这样,您的程序将在第 N+1 次访问时中断,您将拥有完整的堆栈跟踪。

    【讨论】:

    • 我建议每个开发人员花半个小时来研究他们使用的调试器的功能(例如按照 Sridhar Iyer 的建议在断点上设置条件)。然而,当我观察我的同事时,我看到他们添加打印语句进行调试并浪费大量时间。我只是不明白...
    • @Codo - 打印语句是一个非常宝贵的调试工具,我精通 VS 调试器、Windbg 并且在大学中使用过很多 gdb,但我仍然多次使用打印语句进行调试。奇怪的是,在阅读《Coders At Work》(见codersatwork.com)这本书时,许多业内“精英”表示他们很多时候只是使用打印语句进行调试。
    • @Code 我同意,但是找到一本可以教你 c++ 的好书比找到一本教你如何调试的好书要容易得多
    【解决方案2】:

    如果您知道必须进行多少次迭代(在本例中为 10,000 次),那么您当然可以在 n 的循环中插入一个命中计数(在错误之前一个),然后执行步骤- 在下一次迭代中使用 Intellisense 为您提供可能导致问题的信息?

    您有任何可以帮助我们帮助您的代码吗?

    【讨论】:

      【解决方案3】:

      vs2010中的intellitrace可以做到这一点

      http://msdn.microsoft.com/en-us/magazine/ee336126.aspx

      【讨论】:

        【解决方案4】:

        我不知道有任何这样的工具,但替代方法是在每个条件中打印不同的消息。

        if(somethingThatMightNotHappen) {
            printf("This happened.\n");
            ...
        }
        

        【讨论】:

        • 但是如果你有 10000 行代码,这是不切实际的。如果至少有一个可以自动实现...
        【解决方案5】:

        不,VS 调试器不允许您通过时间向后移动。

        但是,看看条件断点。当循环运行第 N 次(或第 N-1 次或其他任何时间)或满足特定条件(如变量 idx > 1000)时,您可能会中断并单步执行代码。

        【讨论】:

        • 实际上我认为它在vs2010中可以;但我不确定它支持哪些语言msdn.microsoft.com/en-us/magazine/ee336126.aspx
        • @pm100:哇,读起来很有趣!我还没有时间玩VS2010。
        • 您也可以使用 GDB 与 record、rs 和 rn 一起执行此操作。
        【解决方案6】:

        如果您在 Visual Studio 中设置了代码分析,则可以对其进行配置以提供代码覆盖率信息,这将提供您正在寻找的一些信息,但这无助于解决问题。

        我将采取的方法是将循环计数减少到可管理的数字(例如 10)并逐步执行代码。如果您知道您希望发生什么,我发现单步执行代码并验证它是否正在执行您对小型测试集所期望的操作可以澄清任何奇怪的行为。

        根据我的经验,没有什么比预测计算机会做什么然后验证你们是否同意更重要的了。最常见的原因是:

        • 您的条件是 LESS THAN OR EQUAL 而不是 LESS THAN
        • 您测试的结果比预期的要多
        • 您的数组比您预期的要小一个
        • 您从 1 开始计数并循环遍历元素的数量

        Off-by-one(最后三个)几乎是算法中最常见的错误。

        【讨论】:

          【解决方案7】:

          单元测试框架会做你想做的事。您需要创建一个运行您要调用的函数的单元测试。然后,编辑您的测试运行配置以启用代码覆盖率。

          最后,一旦你运行了你的单元测试(可以只是一行代码来执行一个函数),进入“代码覆盖结果”窗口并选择“显示代码覆盖颜色”选项。已执行的代码将显示为蓝色,未执行的代码将显示为红色。

          很漂亮,嗯?

          更新 在回应有关 C++ 的评论时,我确实相信此功能适用于 C++,但我从未使用过它。尝试用鼠标右键单击实现要测试代码覆盖率的功能的代码。应该有一个选项说“创建单元测试”。请务必在执行此操作之前构建代码。

          【讨论】:

            【解决方案8】:

            尝试捕捉异常!只需将循环内的代码放入 try 块,然后是带有断点的 catch 块。

            【讨论】:

              【解决方案9】:

              已经提到了其中一些调试技术,我不能保证所有的调试技术都适用于 C++,但 ScottGu 在他的 blog post 中有一个很好的提示列表。

              我想您已经知道这一点,但在我看来,您正在寻找调试模式下的调用堆栈选项卡。您可以在循环中使用 Hit Count 或 Conditional 调试模式,当错误出现时,您可以返回调用堆栈到数据的来源并设置几个断点。然后你可以再次运行你的程序并检查数据是如何构建的。

              【讨论】:

                猜你喜欢
                • 2023-04-08
                • 2020-10-16
                • 1970-01-01
                • 2021-02-22
                • 1970-01-01
                • 1970-01-01
                • 2010-10-20
                • 2021-07-23
                • 1970-01-01
                相关资源
                最近更新 更多