如何在调试时观察多个变量而不会在断点处停止?

Fab*_*ino 3 c++ ide debugging

假设我有一个复杂的 C++ 应用程序,我需要使用大量变量进行调试。我想避免使用std::coutprintf方法(下面有解释原因)。

为了解释我的问题,我写了一个最小的例子chrono (这个程序fps随着时间的推移计算它的 while 循环并递增i_times计数器直到它达到 10k)

#include <chrono>

using chrono_hclock = std::chrono::high_resolution_clock;

int main(int argc, char** argv){
    bool is_running = true;
    float fps;
    int i_times=0;
    chrono_hclock::time_point start;
    chrono_hclock::time_point end;

    while(is_running){
         start = chrono_hclock::now();

         // Some code execution

         end = chrono_hclock::now();

         fps=(float)1e9/(float)std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count());
         if(++i_times==10000) is_running=false;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想调试这个程序并随着时间的推移不断观察fpsi_times变量,而不停止执行

当然,我可以简单地使用std::cout,printf或其他方法来输出变量值,stdout在调试时将它们重定向到文件或文件,这些对于简单类型来说是可以的,但是我有多个变量,其数据类型是基于结构的,这会令人毛骨悚然,而且耗时和代码膨胀来编写指令来打印它们中的每一个。此外,我的应用程序是使用 RTSP 协议进行流式传输的实时视频/音频 H.264 编码器,并且在断点处停止意味着在我的其他解码器应用程序中可视化工件,因为编码器无法跟上解码器(因为编码器遇到了断点)。

我该如何解决这个问题?

感谢致敬!


我目前用于开发的 IDE 是Visual Studio 2019 Community

我正在使用本地 Windows 调试器

我愿意使用替代的开源 IDE,如 VSCode 或替代的调试方法来解决这个问题和/或不局限于使用特定的 IDE。

为了在VS 中观察特定的多个变量,我使用了内置的WatchWindow。在使用 进行调试时LWD,我通过在源代码中右键单击变量并单击 来手动添加变量Add Watch。然后这些显示在Watch窗口中(Debug-Windows-Watch-Watch 1)watch_window_1

但是,一旦我在 中设置的断点,我只能观看此窗口内容while cycle,从而阻止执行,因此不能解决我的问题。

arm*_*scu 8

您可以使用非阻塞断点。首先添加断点。然后单击断点设置或右键单击并选择操作。
在此处输入图片说明
现在您添加一条消息,就像任何对您有暗示的字符串一样。并在括号中包括要显示的值,例如

value of y is {y} and value of x is {x}
Run Code Online (Sandbox Code Playgroud)

图中显示了 i 到达断点时的值。检查“继续代码执行”,以便断点不会阻止执行。断点的形状将变为红色对角正方形。如果单击条件复选框,您还可以添加特定条件。
现在,在调试所有这些调试消息时,将显示在输出窗口中:
在此处输入图片说明
在上图中,它显示了以下消息:

the value of i is {i}
Run Code Online (Sandbox Code Playgroud)

通过检查“条件”,您可以添加特定条件,例如 i%100==0,并且仅当 i 可被 100 整除时才会显示消息。
在此处输入图片说明
这次你的断点将被标记为 + 号,表示它有条件。现在,在调试时,只有在被 100 整除时才会显示 i,因此您可以将输出限制为一些更有意义的情况
在此处输入图片说明

  • 我使用 VS 十多年了,却从未注意到!我认为这应该是公认的答案! (3认同)