使用调试器附加到正在运行的 Go 进程
在 GoLand 中,您可以将调试器附加到正在运行的 Go 进程 在本地计算机上、 在远程计算机上或 在 Docker 容器中。
附加到本地计算机上的进程
您可以调试从命令行启动的应用程序。 在这种情况下,应用程序运行在 IDE 之外,但在同一台本地计算机上。 要调试应用程序,您需要在 IDE 中打开项目并将调试器附加到正在运行的进程。
出于示例目的,您可以使用 github.com 上的以下 Go 代码。
步骤 1。 安装 gops 包
打开 终端 工具窗口( ),并运行以下命令:
go install github.com/google/gops@latest点击 (Ctrl+Alt+F5)。 在通知窗口中,点击 调用 'go get gops' 链接。

步骤 2。 构建并运行应用程序
步骤 3。 附加到正在运行的进程并进行调试
点击代码行旁的边距以设置断点。 在 提供的示例中,将断点放置在第 23 行(
message := fmt.Sprintf("Hello %s!", r.UserAgent()))。 在 断点 中了解更多关于断点的信息。点击 或使用快捷键 Ctrl+Alt+F5。
在 使用调试器附加到 窗口中,选择您的应用程序进程并按 Enter。
触发应用程序中与断点相关的事件。 如果使用提供的代码示例,请在浏览器中打开 http://localhost:8080/ 链接。
附加到远程计算机上的进程
您可以连接到远程计算机并将调试器附加到其上运行的 Go 进程。 远程调试器(Delve)必须在远程计算机上运行。
要安装 Delve,您可以使用以下命令:
步骤 1。 在远程计算机上构建应用程序
打开 终端 工具窗口( ),并运行以下命令:
go build -gcflags="all=-N -l" -o myApp.exe此命令编译
myApp.exe可执行文件,并禁用编译器优化和内联。
步骤 2。 在远程计算机上运行 Delve
您有两种选项可以在主机上启动调试器:
调试器为您运行进程。 如果您使用防火墙,请开放配置中使用的端口(例如,
2345)。 您可以使用任何未被占用的端口号。myApp是 步骤 1中构建的可执行文件的名称。dlv --listen=:2345 --headless=true --api-version=2 exec ./myApp如果需要按原样传递参数给二进制文件,请在前一个命令中添加双破折号符号(
--),然后添加必要的选项(例如,-- --config=/path/to/config/file)。您运行进程,调试器附加到正在运行的进程。
<PID>是您的应用程序的进程标识符。 您可以通过使用 附加到进程命令获取进程标识符。dlv --listen=:2345 --headless=true --api-version=2 attach <PID>

步骤 3。 在本地计算机上启动调试过程
打开您的应用程序代码并设置断点。 在 提供的代码示例中,在第 23 行设置断点(
message := fmt.Sprintf("Hello %s!", r.UserAgent()))。 在 断点 中了解更多关于断点的信息。单击 。 或者,点击工具栏上的运行/调试配置列表并选择 编辑配置。
在 运行/调试配置 对话框中,点击 添加 按钮(
),然后选择 转到远程。
在 主机 字段中,输入主机 IP 地址(例如,
localhost或192.168.1.33)。在 端口 字段中,输入您在 步骤 2中配置的调试器端口(例如,
2345)。单击 调试。
触发应用程序中断点处的事件。 如果您使用了 提供的代码示例 ,请在浏览器中打开
http://<host_address>:8080/。在以下视频中,有两个 IDE 实例:使用深色主题的 IDE 是本地计算机,使用浅色主题的 IDE 是远程计算机。
附加到 Docker 容器中的进程
您可以将调试器附加到在 Docker 容器中运行的 Go 进程。 有关 Docker 的更多信息,请参阅 Docker。
出于示例目的,您可以为 此 Go 应用程序使用 以下 Dockerfile。
步骤 1。 创建 Dockerfile 配置
单击 。 或者,点击工具栏上的运行/调试配置列表并选择 编辑配置。
在 运行/调试配置 对话框中,点击 添加 按钮(
),然后选择 。
在 Dockerfile 字段中,点击 浏览 图标(
),并在文件浏览器中导航到 Dockerfile 。 如果您使用本节中的示例,请导航到 此 Dockerfile。
在 容器名称 字段中,输入容器名称(例如,
debugging-tutorial。在 运行/调试配置 对话框中,点击 修改 并选择 绑定端口 和 运行选项。

在 绑定端口 字段中,点击 浏览 (
)。
在 端口绑定 对话框中,点击 添加 按钮(
)。 在 主机端口 列中,输入
8080。 点击 容器端口 列,输入8080。 另外,为端口40000创建相同的绑定。
在 运行选项 字段中,指定 Docker 的命令行选项。 对于 Dockerfile 中提供的示例,禁用 安全配置文件 ,并添加
SYS_PTRACELinux 功能。--security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE单击 运行。

步骤 2。 创建 Go Remote 运行/调试配置
步骤 3。 启动调试过程
在 服务 工具窗口( )中,展开 。 确保创建的容器正在运行并监听预配置的调试器端口。
点击代码行附近的边距以放置断点。 例如,在 提供的代码示例中,将断点放置在第 23 行(
message := fmt.Sprintf("Hello %s!", r.UserAgent()))。在 断点 中阅读有关断点的更多信息。
从工具栏上的运行/调试配置列表中,选择 创建的 Go Remote 配置 ,并点击 调试 <configuration_name> 按钮(
)。 或者,按 Alt+Shift+F9 选择创建的 Go Remote 配置。
触发应用程序中断点处的事件。 如果您使用了 提供的代码示例 ,请在浏览器中打开 http://localhost:8080/。
以下视频演示了如何运行容器、创建远程运行/调试配置以及连接到容器进行调试。
提高效率的提示
终止远程进程
在远程调试会话期间,您可以按 Ctrl+F2 终止远程进程。 请注意,终止进程后,您无法重新附加到该进程。

