Golang和Java中的远程调试

390 阅读5分钟

调试是任何开发人员不可缺少的工具。它为我们提供了一种分析代码的方法,因为它正在处理数据。我们作为整个过程的指挥者,可以暂停流程并分析数据,意识到代码正在做什么。

所有目前可用的语言都提供了某种通过代码进行调试的方法。你把你最喜欢的IDE,添加一些插件,然后就可以了。你可以在本地开始调试你的代码。

然而,远程调试是一个完全不同的野兽。当你想调试不在本地环境中运行的东西时,它是理想的选择。关于所有调试进程的通信需要通过网络来进行。

在这篇文章中,我们将探讨如何进行远程调试。

现代工具中的调试支持

我个人在我所有的项目中使用IntelliJ和VSCode这两个世界上最流行的IDE。

IntelliJ和其他Jetbrains IDEs

在IntelliJ中设置远程调试其实是很简单的。如果你像我一样使用的是专业许可证,那么这些插件会使调试过程简单得像蛋糕。

下面是目前在IntelliJ中提供的用于远程调试的插件。

Remote Debugging Intellij

VSCode

VSCode中,设置是通过项目根部的.vscode文件夹中的 launch.json文件进行的。

为什么远程调试是有用的?

在低级环境中

在本地环境和服务器环境中运行一个应用程序是完全不同的。一段代码经常在本地运行,但在服务器中与其他服务通信时却出现故障。远程调试使我们能够灵活地在服务器环境中迅速发现问题。

在生产中

在生产环境中调试一个错误是不容易的。如果不知道这个错误,好的做法是把生产流量复制到一个在调试模式下运行的预生产的服务器上并调试这个问题。这样,我们就可以非常迅速和有效地抓住问题,并发送一个错误修复。

现在让我们看看如何在两种比较流行的语言中进行远程调试。

在Java中进行远程调试

Java是当今最流行的语言之一。它在25年前首次出现,现在仍在不断发展壮大。从一开始的编译和静态类型语言,到今天,许多动态语言,如Clojure、Scala和Kotlin,都在真正成熟的运行时JVM上运行。

在这里,我们将远程调试一个在EC2服务器上运行的Java应用样本

步骤1

要设置这个过程,我们需要在Java启动脚本中添加以下选项。

JDK9及以上版本。

-agentlib:jdwp=transport=dt_socket,server=y,address=*:5005,scuend=n

JDK 5 - 8

-agentlib:jdwp=transport=dt_socket,server=y, suspend=n,address=5005

Remote Debugging Java

在这里,我正在EC2服务器中运行一个用Spring Boot构建的简单Java应用程序。在第二行中,我们可以看到5005端口是用来调试的。现在,我们需要把它添加到安全组中。

第2步

将EC2服务器的安全组设置为只允许5005端口的入站流量。这个配置将让我们使用我们的IDE连接到远程EC2服务器中运行的jvm进程。如果不这样做,将导致连接被拒绝。

Edit Inbound Rules

第3步

配置我们的IDE以连接到AWS EC2服务器。命令调色板可在IntelliJ主页的配置菜单中找到。

* 提供主机名,作为EC2的公共IP。
* 提供我们在安全组中配置的5005端口。

Remote Debugging Java Intellij

这就是了。我们现在可以调试了。一旦我们连接上了,我们会看到下面的信息。

Remote Debug Console

Golang中的远程调试

Golang是一个新的孩子。Go是一种静态类型的编译编程语言,由Robert Griesemer、Rob Pike和Ken Thompson在Google设计。它于2009年首次出现,通过提供一种具有垃圾收集和交叉编译功能的易学语言以及静态链接的二进制文件,迅速获得了良好的势头。

对于Golang项目来说,这个过程并没有什么不同。我们可以使用一个Golang项目的样本来了解如何使用远程调试。

第一步

安装Delve,Go的调试器。

第2步

允许Delve编译应用程序。

dlv debug -headless -listen=:5005 -api-version=2 -accept-multiclient

或者使用Go 1.10或更新版本编译应用程序。

go build -gcflags "all=-N -l" main.go (在我的例子中,它可能是一个适合你情况的包)

这一步对于创建一个没有优化和内联的二进制文件是必要的。我们可能不想在生产中使用它,而只是为了调试的目的。

第三步

用下面的命令启动Delve的应用程序。

dlv -listen=:5005 -headless=true -api-version=2 -accept-multiclient exec ./main

Go Remote Debug

第四步

像这样配置IDE(对我来说是Golang/IntelliJ)。

* 提供主机名,作为EC2的公共IP。
* 提供端口5005,因为我们上次在做Java调试时配置了它。

Go Remote Debug Intellij

然后使用创建的配置进行调试。

Go Code Debug Point

结论

在这篇文章中,我们了解了远程调试的优势,以及何时和如何使用它对我们有利。无论你是一个经验丰富的程序员还是一个新手,有关远程调试的知识将在你的领域中更好地服务,无论情况如何。

祝您好运!如果你喜欢这篇文章,请考虑分享它。