使用Gdbgui进行可视化调试

2020-07-17 15:00:24

开发人员花费大量时间调试和维护当前的代码库。了解不同的调试方法至关重要。一些开发人员仍然对更手动的调试方式感到满意。还有很多快照工具可以在特定部分代码运行后为您提供问题和错误的详细报告。这两种方法都是有益的,但它们通常侧重于错误发生的时间。在调试器工具的帮助下,我们可以看到错误是如何发生的。

在这篇文章中,我们将研究gdbgui,它是gdb的一个扩展,具有可视化调试功能,这将帮助我们调试编译语言。

Gdb是一个非常方便的工具,用于调试C、C++、Go、Rust等编译语言。它适用于Mac、Windows和Linux等常见操作系统。此调试器可以在几个方面为我们提供帮助,例如:

如果核心转储(特定时间的内存状态)由于崩溃或异常终止而发生,我们可以理解是什么表达式语句导致了它。

在程序运行时停止导致问题的程序部分。

在调试的同时对程序进行测试和试验,以缩小或修复问题。

虽然这些对我们的调试工作非常有帮助,但是您仍然需要在终端中运行调试命令,并且可能不能很好地了解程序的上下文。

Gdbgui是另一个构建在gdb之上的调试工具。主要区别在于,gdbgui向开发人员公开了一个基于浏览器的前端,因此他们可以在调试器运行时添加断点、查看堆栈跟踪以及更改上下文和参数值。

该图书馆利用WebSockets。无论何时启动前端调试工具,都会建立一个WebSocket连接,这是浏览器和后端之间的通信通道。在每个已建立的WebSocket之后,后端启动一个新的托管GDB子进程来解析输出,同时产生一个单独的子进程来不断检查来自另一个子进程的输出。最后,它使用相同的WebSocket将输出传输到客户端。

让我们在我们的机器上安装gdbgui。如前所述,gdbgui可以安装在各种操作系统上,但也可以远程运行。

根据您的操作系统,有几种方法可以在您的计算机上安装gdbgui,但我将遵循最简单、最直接的一种方法。由于该库依赖于Python3,因此在遵循任何安装指南时都需要小心,因为它可能会干扰您计算机的全局设置。

安装gdbgui的最佳方式是通过PIPEX。该工具允许您在隔离环境中安装库和用Python编写的应用程序,同时允许您通过Shell将它们作为全局变量通过Shell运行。这消除了由于版本不兼容而可能发生的许多令人头疼的问题。

//第一步:安装pyxpython3-m pip install--user pinx//第二步:在用户路径python3-m userpath append中添加新路径~/.local/bin//第三步:安装gdbguipx install gdbgui//也可以在不安装Pipx的情况下运行gdbgui运行gdbgui。

让我们使用gdbgui调试一个简单的C++程序来熟悉它的特性。

首先,使用页面右侧的下拉列表将此存储库下载到您的计算机。

//首先,进入C examplecd gdbgui-master/examples/c//的目录;其次,运行命令运行debuggermake

乍一看,我们在这个页面上看到了很多选项。但我们需要考虑的一件事是,该工具的开发人员试图限制可用GUI选项的数量,以减少调试时的混乱。

在页面顶部,我们看到一个名为Load Binary的部分,我们可以使用它来加载程序二进制文件(具有运行gdbgui的相对路径),还可以像在命令行中那样向它传递参数。请注意,这一节只接受可执行文件,因此您不能只传递目录中的当前可执行文件而不对其进行编译。

在页面的右侧,我们有一个控制器部分,它将允许开发人员控制调试的一般流程,如从头重新启动程序、继续到下一个断点、向gdb进程发送“中断”信号以暂停以及跳过、进入或跳出下一个函数调用。所有这些控件也都有键盘快捷键。

在页面底部,您会看到一个用于显示程序或gdb输出的输出部分。它还允许您在终端部分运行gdb命令。

加载可执行文件时,您会在页面中间看到应用了断点的源代码。此外,我们还看到一个下拉部分,其中显示了用于编译可执行文件的所有源文件的列表。虽然没有必要在下拉菜单中指定源文件,但对于某些调试场景(如Rust),您可能需要通过在下拉部分中输入主源文件的名称并选择它来引导gdbgui。

在右侧,您还可以看到几个面板。调用堆栈部分显示我们在堆栈中某个断点上的位置(文件和指令地址,这是代码中指向断点的指针)。我们还可以探索与受攻击断点相关的局部变量。此外,通过单击此处的任何区域设置,我们可以看到详细的树状视图,该视图可以以可视化格式显示变量之间的复杂关系。

我们还有一个表达式部分,在那里我们可以在程序的整个生命周期中持久地监视某个值。对于预期将在程序的不同序列中更改的变量,这将是很有趣的。

调试器的一个很酷的特性是它将内存地址转换为超链接,这样您就可以单击它们。完成后,您可以看到数据表中的所有内存地址,并识别它们所指的字符。

使此调试器与众不同的另一个可视功能是能够监视图表上特定变量随时间的值。

如果您单击表达式部分中的图表图标,您将看到一个既有X线又有Y线的图形。如果表达式的值在调试器的运行时中发生更改,您将能够在图形上直观地看到此更改。

最后,我们可以浏览调试器的设置部分,通过单击页面右上角的齿轮图标可以访问该调试器的设置部分。许多设置都是不言而喻的,比如在加载可执行文件后向Main添加断点。此外,如果在从终端发送命令时保留刷新组件的选项,那么您将能够在每个命令之后刷新所有可视视图(就像输入n作为下一行执行)。您还可以在这里设置调试器的主题(我个人更喜欢较暗的模式,这就是为什么我将其保留为Monokai)。

最后,您可以选中该选项以打印控制台中的所有命令。选中此选项不仅会显示您运行的所有命令,还会显示gdbgui出于调试目的在后台运行的所有命令。在大多数情况下,最好取消选中此选项,因为它会使终端控制台变得嘈杂且难以阅读。

您可以遵循本指南中的说明,也可以遵循gdbgui的官方wiki来测试调试流程。如果您无法访问适当的IDE调试器工具,并且希望在几秒钟内启动可视化调试器界面并开始调查问题,则这样的工具可能对您特别有帮助。

另外,请记住,C语言并不是您可以使用此工具进行调试的唯一语言。它还支持多种语言,如Rust和Go。但是,您可能需要在调试器环境中进行一些小的调整,以使其也适用于这些语言。对于这些场景,请务必查看gdbgui的官方文档以熟悉正确的安装指南。

LogRocket是一个前端应用程序监控解决方案,它允许您重播问题,就像它们发生在您自己的浏览器中一样。LogRocket不是猜测错误发生的原因,也不是要求用户提供屏幕截图和日志转储,而是让您重播会话以快速了解哪里出了问题。它可以完美地与任何应用程序协同工作,无论其框架如何,并且有插件可以记录来自Redux、Vuex和@ngrx/store的其他上下文。

除了记录Redux操作和状态之外,LogRocket还记录控制台日志、JavaScript错误、堆栈跟踪、带有标题+正文的网络请求/响应、浏览器元数据和自定义日志。它还检测DOM来记录页面上的HTML和CSS,即使是最复杂的单页面应用程序也可以重新创建像素完美的视频。

免费试用一下。