使用GoLand进行调试 3- 高级调试功能

由FlorinPăţan于2019 年3月4日发表

今天我们开始使用GoLand进行一系列调试的最后一篇文章。之前我们讨论过诸如配置调试器和调试会话,如何控制调试器执行流程和配置断点以及即将到来的2019.1版本中的一些最新改进。

在今天的文章中,我们将讨论GoLand的两个高级调试功能:核心转储调试和使用可逆调试器Mozilla rr。

调试核心转储

核心转储是在某个特定时间点运行的应用程序的内存快照。它们可以帮助我们可视化所有存在的goroutine,包含变量的所有值,以及每个活动goroutine的当前执行点。

目前,GoLand仅支持在Linux系统上采用的核心转储,但它可以在任何操作系统上读取和分析它们。

有两种方法可以获得核心转储。如果我们希望在进程因崩溃而终止时看到内存中的值,我们需要将ulimit设置得相当高,例如sudo ulimit -c unlimited,并配置以下环境变量GOTRACEBACK=crash。这将使Go应用程序在打印堆栈跟踪并写入核心转储文件时崩溃。

为了能够从正在运行的进程中获取核心转储而不必使其崩溃,我们需要在系统上安装gdb并运行以下命令:

sudo ulimit -c unlimited
echo 0 | sudo tee -a /proc/sys/kernel/yama/ptrace_scope

请注意,此值将在系统重新启动时重置,您需要再次进行配置。

要生成和使用核心转储,我们需要配置IDE以将二进制文件保存在已知位置,例如我们的项目根目录。

使用GoLand进行调试 - 18

之后,我们可以像往常一样启动应用程序,并开始向它发送请求。接下来,在确定应用程序的进程ID之后,我们可以调用gcore 并获取转储文件。

使用GoLand进行调试19

要研究IDE中的核心转储,我们可以使用从远程服务器生成的二进制和核心转储,也可以使用通过运行上述命令生成的二进制和核心转储。然后转到Run | 打开Core Dump ... 并选择可执行文件和核心转储文件。这将打开调试器界面,让您查看正在运行的goroutine,线程,所有变量的值的列表。您可以使用“ 评估”功能来了解应用程序当前正在执行的操作。

使用GoLand进行调试 - 20

使用核心转储可以帮助您确定goroutine被卡住的位置,有多少goroutine,以及在问题发生时它们在内存中具有哪些值。

Mozilla rr可逆调试器

但是,使用核心转储是一个静态过程。有时候一个bug很难复制,需要很多调试会话才能重现它,然后再查看它是否有问题。

输入可逆调试器。这些调试器不仅允许我们在执行中前进,而且还可以返回并有效地撤消步骤之间的所有操作。

Delve,GoLand使用的Go调试器通过使用Mozilla的rr项目支持这种功能。根据rr项目的描述,它的任务是允许“在调试器下重复执行失败的执行,直到完全理解为止”。

使用rr的另一个好处是它在会话的录制部分期间执行开销很低。这意味着它可以用于生产系统或类似生产的金丝雀系统,以捕获无法以其他方式复制的错误,然后在舒适的开发环境中进行调查。

让我们看看这个在行动。

在我们开始之前,rr可以运行的地方有一些严格的限制,应该提前知道。它只能在Linux上运行,并且对硬件/虚拟机功能有一些限制。这些会影响此调试解决方案的有用性。但是,一旦环境满足要求,它将成为最强大的解决方案之一。

后安装RR,我们需要运行几个命令,使RR可以执行记录的部分:

echo  -1  |  sudo tee  -a  /proc/sys/kernel/perf_event_paranoid

echo  0  |  sudo tee  -a  /proc/sys/kernel/kptr_restrict

这些设置不是永久性的,如果重新启动机器,则需要再次应用这些设置。

单击main函数旁边的绿色箭头,然后选择Record and Debug ... 这将启动所需的编译步骤,然后使用rr后端启动调试器。

使用GoLand进行调试 - 21

对于设计为连续运行的应用程序,例如示例代码中的Web服务器,我们需要停止调试器,然后选择Run | Debug Saved Trace ... 默认情况下,将选择最新的rr会话,以便我们单击OK按钮启动调试会话。

使用GoLand进行调试 - 22

对于终止的应用程序,如CLI应用程序,GoLand将自动启动重播会话。

这是调试会话与常规调试会话不同的地方。在会话的“记录”部分期间,调试器不会在断点处停止; 它只会在重播部分这样做。如果没有设置断点,则调试器将结束,我们需要手动重放上一个会话,同时需要存在断点 - 否则这将完成重播会话并退出而不停止。

如果存在断点,则调试器将停止,并且它将提供与正常调试器会话类似的体验。

使用GoLand进行调试 - 23

至于“可逆”部分,这是使用rr的最佳部分发挥作用的地方。如果在当前执行点之前放置断点,那么我们可以使用“倒带”功能返回到它并从那里重试执行。观察变量或评估表达式等功能也会起作用。

使用GoLand进行调试 - 24

我希望这篇文章将帮助您发现一个新的强大工具,可以加快查找和修复应用程序中的错误。

你可能感兴趣的:(使用GoLand进行调试 3- 高级调试功能)