假设我有一个复杂的 C++ 应用程序,我需要使用大量变量进行调试。我想避免使用std::cout和printf方法(下面有解释原因)。
为了解释我的问题,我写了一个最小的例子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)
我想调试这个程序并随着时间的推移不断观察fps和i_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):

但是,一旦我在 中设置的断点,我只能观看此窗口内容while cycle,从而阻止执行,因此不能解决我的问题。
您可以使用非阻塞断点。首先添加断点。然后单击断点设置或右键单击并选择操作。

现在您添加一条消息,就像任何对您有暗示的字符串一样。并在括号中包括要显示的值,例如
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,因此您可以将输出限制为一些更有意义的情况

| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |