在 GoLand 中,您可以将调试器附加到本地机器、远程机器或Docker 容器中正在运行的 Go 进程。

附加到本地计算机上的进程

您可以调试从命令行启动的应用程序。在这种情况下,应用程序在 IDE 之外运行,但在同一台本地计算机上。要调试应用程序,您需要在 IDE 中打开项目并将调试器附加到正在运行的进程。

出于示例目的,您可以在 github.com 上使用以下 Go 代码。

步骤 1. 安装 gops 包

  • 打开终端工具窗口(查看|工具窗口|终端)并运行以下命令:

    go get -t github.com/google/gops/
  • 单击运行 | 附加到进程( Ctrl+Alt+F5)。在通知窗口中,单击Invoke 'go get gops'链接。

1.png

步骤 2. 构建并运行应用程序

  1. 打开终端工具窗口(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可执行文件并禁用编译器优化和内联。

  1. 运行已编译的可执行文件(例如,./myApp)。

2.png

不要使用-ldflags="all=-w"-ldflags="-w"标记。这些标志与调试应用程序不兼容,因为它们去除了 Delve 所需的必要 DWARF 信息。

由于 Go 工具链、Delve 和 GoLand 之间的不兼容,符号链接或符号链接与调试不兼容。

步骤 3. 附加并调试正在运行的进程

  1. 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 ( message := fmt.Sprintf("Hello %s!", r.UserAgent()))。
  2. 单击运行 | 附加到进程Ctrl+Alt+F5。
  3. 在Attach with Debugger To窗口中,选择您的应用程序进程并按Enter。
  4. 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开http://localhost:8080/链接。

3.gif

附加到远程计算机上的进程

您可以连接到远程计算机(主机)并将调试器附加到在主机上运行的 Go 进程。远程调试器 (Delve) 必须在远程计算机上运行。

使用与您的应用程序相同的 Go 版本、主机和目标编译 Delve,因为各种操作系统之间可能存在细微差异,这可能导致调试会话无法按预期工作。

步骤 1. 在主机上构建应用程序

  1. 如果您使用该$GOPATH方法,请确保使用与$GOPATH主机和客户端计算机上相同的相对路径编译项目。例如,如果您在主机上的应用程序代码位于$GOPATH/src/debuggingTutorial/. 客户端上的代码必须在同一目录中 ( $GOPATH/src/debuggingTutorial/)。
  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可执行文件并禁用编译器优化和内联。

4.png

步骤 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>

5.png

步骤 3. 在客户端计算机上创建 Go Remote 运行/调试配置

  1. 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
  2. 在Run/Debug Configurations对话框中,单击Add按钮 ( 添加按钮) 并选择Go Remote。
  3. 在主机字段中,输入主机 IP 地址(例如192.168.1.33)。
  4. 在端口字段中,键入您在步骤 2中配置的调试器端口(例如,2345)。
  5. 单击确定。

步骤 4. 在客户端计算机上启动调试过程

  1. 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 ( message := fmt.Sprintf("Hello %s!", r.UserAgent()))。
  2. 从工具栏上的运行/调试配置列表中,选择创建的 Go Remote 配置并单击Debug <configuration_name>按钮 ( 调试按钮)。或者,按下Alt+Shift+F9并选择创建的 Go Remote 配置。
  3. 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开http://<host_address>:8080/链接。

7.gif

附加到 Docker 容器中的进程

您可以将调试器附加到在 Docker 容器中运行的 Go 进程。

例如,您可以为此Go 应用程序使用以下 Dockerfile。将Dockerfilemain.go保存在$GOPATH /src /debuggingTutorial中。注意Dockerfile使用了debuggingTutorial目录。如果您为项目使用不同的目录,请更改 Dockerfile 中的目录名称。

步骤 1. 创建 Dockerfile 配置

  1. 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
  2. 在Run/Debug Configurations对话框中,单击Add按钮 ( 添加按钮) 并选择Docker | Docker 文件。
  3. 在Dockerfile字段中,单击浏览图标 ( 浏览图标) 并在文件浏览器中导航到Dockerfile 。
  4. 在容器名称字段中,输入容器名称(例如,debugging-tutorial.
  5. 在绑定端口字段中,单击浏览图标 ( 浏览图标)。单击添加按钮 ( 添加按钮)。在主机端口列中,键入8080。单击容器端口列,键入8080。此外,为 port 添加相同的绑定40000

8.png

  1. 在运行选项字段中,指定 Docker 的命令行选项。对于 Dockerfile 中提供的示例,禁用安全配置文件并添加SYS_PTRACE Linux 功能。

    --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE
  2. 单击确定。

9.png

步骤 2. 运行 Dockerfile 配置

  • 从工具栏上的运行/调试配置列表中,选择创建的 Dockerfile 配置,然后单击运行 <configuration_name>按钮 ( 运行按钮)。

10.gif

步骤 3. 创建 Go Remote 运行/调试配置

  1. 点击编辑 | 运行配置。或者,单击工具栏上的运行/调试配置列表并选择Edit Configurations。
  2. 在Run/Debug Configurations对话框中,单击Add按钮 ( 添加按钮) 并选择Go Remote。
  3. 在主机字段中,输入主机 IP 地址(例如localhost)。
  4. 在端口字段中,键入您配置的调试器端口。在提供的示例中,它是40000.
  5. 单击确定。

11.gif

步骤 4. 开始调试过程

  1. 在服务工具窗口(查看 | 工具窗口 | 服务)中,展开Docker | 容器。确保创建的容器正在运行并侦听预配置的调试器端口。
  2. 单击代码行附近的装订线以放置断点。例如,在提供的代码示例中,将断点放在第 23 行 ( message := fmt.Sprintf("Hello %s!", r.UserAgent()))。
  3. 从工具栏上的运行/调试配置列表中,选择创建的 Go Remote 配置并单击Debug <configuration_name>按钮 ( 调试按钮)。或者,按Alt+Shift+F9,选择创建的 Go Remote 配置。
  4. 在应用程序的断点处触发事件。如果您使用了提供的代码示例,请在浏览器中打开http://localhost:8080/链接。

12.gif

生产力提示

终止远程进程

  • 您可以Ctrl+F2在远程调试会话期间按 终止远程进程。请注意,当您终止该进程时,您无法重新附加到该进程。

13.gif

标签: goland注册码, goland激活码, goland破解, goland破解教程, goland注册码2021, goland注册码失效, goland注册码永久, goland注册码2022, GoLand, GoLand教程, GoLand基础教程, GoLand入门教程, GoLand高级教程, GoLand核心教程, GoLand破解插件, GoLand注册码在线生成, GoLand插件, GoLand主题