【发布时间】:2020-06-09 11:51:40
【问题描述】:
假设我有一个复杂的 C++ 应用程序,我需要使用很多变量进行调试。我想避免使用std::cout 和printf 方法(下面有解释原因)。
为了解释我的问题,我使用chrono 编写了一个minimal 示例(该程序计算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;
}
我想调试这个程序并随着时间的推移持续观察fps 和i_times 变量,不停止执行。
当然,我可以简单地使用std::cout、printf 或其他方式输出变量值,在调试时将它们重定向到stdout 或文件,这些对于简单类型来说是可以的,但是我有多个数据类型的变量是基于结构的,编写指令来打印它们中的每一个都是令人毛骨悚然、耗时且代码臃肿的。此外,我的应用程序是一个实时视频/音频 H.264 编码器,使用 RTSP 协议进行流式传输,在断点处停止意味着在我的其他解码器应用程序中可视化伪影,因为编码器无法跟上解码器的速度(因为编码器遇到断点)。
我该如何解决这个问题?
感谢和问候!
我目前用于开发的 IDE 是 Visual Studio 2019 Community。
我正在使用本地 Windows 调试器。
我愿意使用 VSCode 等替代开源 IDE 或替代调试方法来解决此问题和/或不局限于使用特定 IDE。
要在 VS 中查看特定的多个变量,我使用内置的 Watch 窗口。在使用LWD 进行调试时,我通过在源代码中右键单击变量并单击Add Watch 来手动添加变量。然后这些显示在Watch Window (Debug-Windows-Watch-Watch 1)中:
但是,当我遇到我在while cycle 中设置的断点时,我可以仅查看此窗口内容,从而阻止执行,所以这并不能解决我的问题.
【问题讨论】:
-
在 while(true) 循环执行后简单地将其写入文件怎么样?制作一些容器,在其中添加或设置值
container[i_times] = fps;?