【GoLand教程】GoLand 如何将debugger调试器附加到正在运行的 Go 进程?

在 GoLand 中,您可以将调试器附加到本地机器、远程机器或Docker 容器中正在运行的 Go 进程。
附加到本地计算机上的进程
您可以调试从命令行启动的应用程序。在这种情况下,应用程序在 IDE 之外运行,但在同一台本地计算机上。要调试应用程序,您需要在 IDE 中打开项目并将调试器附加到正在运行的进程。
出于示例目的,您可以在 github.com 上使用以下 Go 代码。
步骤 1. 安装 gops 包
打开终端工具窗口(查看|工具窗口|终端)并运行以下命令:
go get -t github.com/google/gops/
- 单击运行 | 附加到进程( Ctrl+Alt+F5)。在通知窗口中,单击Invoke 'go get gops'链接。
步骤 2. 构建并运行应用程序
打开终端工具窗口(View | Tool Windows | Terminal)并根据您的 Go 版本运行以下命令:
转到 1.10 及更高版本:
go build -gcflags="all=-N -l" -o myApp
转到 1.9 及更早版本:
go build -gcflags="-N -l" -o myApp
此命令编译myApp
可执行文件并禁用编译器优化和内联。
- 运行已编译的可执行文件(例如,
./myApp
)。
不要使用
-ldflags="all=-w"
或-ldflags="-w"
标记。这些标志与调试应用程序不兼容,因为它们去除了 Delve 所需的必要 DWARF 信息。由于 Go 工具链、Delve 和 GoLand 之间的不兼容,符号链接或符号链接与调试不兼容。
步骤 3. 附加并调试正在运行的进程
- 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)。 - 单击运行 | 附加到进程Ctrl+Alt+F5。
- 在Attach with Debugger To窗口中,选择您的应用程序进程并按Enter。
- 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开
http://localhost:8080/
链接。
附加到远程计算机上的进程
您可以连接到远程计算机(主机)并将调试器附加到在主机上运行的 Go 进程。远程调试器 (Delve) 必须在远程计算机上运行。
使用与您的应用程序相同的 Go 版本、主机和目标编译 Delve,因为各种操作系统之间可能存在细微差异,这可能导致调试会话无法按预期工作。
步骤 1. 在主机上构建应用程序
- 如果您使用该
$GOPATH
方法,请确保使用与$GOPATH
主机和客户端计算机上相同的相对路径编译项目。例如,如果您在主机上的应用程序代码位于$GOPATH/src/debuggingTutorial/
. 客户端上的代码必须在同一目录中 ($GOPATH/src/debuggingTutorial/
)。 打开终端工具窗口(View | Tool Windows | Terminal)并根据您的 Go 版本运行以下命令:
转到 1.10 及更高版本:
go build -gcflags="all=-N -l" -o myApp
转到 1.9 及更早版本:
go build -gcflags="-N -l" -o myApp
此命令编译myApp
可执行文件并禁用编译器优化和内联。
步骤 2. 在主机上运行 Delve
您有两个选项可以在主机上启动调试器:
调试器为您运行该过程。如果您使用防火墙,请公开配置中使用的端口(例如,
2345
)。您可以使用任何未被占用的端口号。myApp
是在Step 1上构建的可执行文件的名称。dlv --listen=:2345 --headless=true --api-version=2 exec ./myApp
如果您需要按原样将参数传递给二进制文件,请将双破折号 ( `--`) 添加到上一个命令,然后添加必要的选项(例如,`-- --config=/path/to/config/file`)。
您运行该进程,调试器将附加到正在运行的进程。
<PID>
是您的应用程序的进程标识符。您可以使用Attach to Process 命令获取进程标识符。dlv --listen=:2345 --headless=true --api-version=2 attach <PID>
步骤 3. 在客户端计算机上创建 Go Remote 运行/调试配置
- 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
- 在Run/Debug Configurations对话框中,单击Add按钮 (
) 并选择Go Remote。
- 在主机字段中,输入主机 IP 地址(例如
192.168.1.33
)。 - 在端口字段中,键入您在步骤 2中配置的调试器端口(例如,
2345
)。 - 单击确定。
步骤 4. 在客户端计算机上启动调试过程
- 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)。 - 从工具栏上的运行/调试配置列表中,选择创建的 Go Remote 配置并单击Debug <configuration_name>按钮 (
)。或者,按下Alt+Shift+F9并选择创建的 Go Remote 配置。
- 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开
http://<host_address>:8080/
链接。
附加到 Docker 容器中的进程
您可以将调试器附加到在 Docker 容器中运行的 Go 进程。
例如,您可以为此Go 应用程序使用以下 Dockerfile。将Dockerfile和main.go保存在$GOPATH /src /debuggingTutorial中。注意Dockerfile使用了debuggingTutorial目录。如果您为项目使用不同的目录,请更改 Dockerfile 中的目录名称。
步骤 1. 创建 Dockerfile 配置
- 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
- 在Run/Debug Configurations对话框中,单击Add按钮 (
) 并选择Docker | Docker 文件。
- 在Dockerfile字段中,单击浏览图标 (
) 并在文件浏览器中导航到Dockerfile 。
- 在容器名称字段中,输入容器名称(例如,
debugging-tutorial
. - 在绑定端口字段中,单击浏览图标 (
)。单击添加按钮 (
)。在主机端口列中,键入
8080
。单击容器端口列,键入8080
。此外,为 port 添加相同的绑定40000
。
在运行选项字段中,指定 Docker 的命令行选项。对于 Dockerfile 中提供的示例,禁用安全配置文件并添加
SYS_PTRACE
Linux 功能。--security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE
- 单击确定。
步骤 2. 运行 Dockerfile 配置
- 从工具栏上的运行/调试配置列表中,选择创建的 Dockerfile 配置,然后单击运行 <configuration_name>按钮 (
)。
步骤 3. 创建 Go Remote 运行/调试配置
- 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
- 在Run/Debug Configurations对话框中,单击Add按钮 (
) 并选择Go Remote。
- 在主机字段中,输入主机 IP 地址(例如
localhost
)。 - 在端口字段中,键入您配置的调试器端口。在提供的示例中,它是
40000
. - 单击确定。
步骤 4. 开始调试过程
- 在服务工具窗口(查看 | 工具窗口 | 服务)中,展开Docker | 容器。确保创建的容器正在运行并侦听预配置的调试器端口。
- 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 (
message := fmt.Sprintf("Hello %s!", r.UserAgent())
)。 - 从工具栏上的运行/调试配置列表中,选择创建的 Go Remote 配置并单击Debug <configuration_name>按钮 (
)。或者,按Alt+Shift+F9,选择创建的 Go Remote 配置。
- 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开
http://localhost:8080/
链接。
生产力提示
终止远程进程
- 您可以Ctrl+F2在远程调试会话期间按 终止远程进程。请注意,当您终止该进程时,您无法重新附加到该进程。