golang remote debug和docker debug

在编写 Go 代码的时候,因为很多时候都是需要调试服务器上的代码的,作为一个年长的工程师,肯定不能用 log.Printf 来调试问题,所以我选择了 delve 这个工具,通过 delve 我可以像本地调试代码一样在 Goland 中调试 Go 代码,很是惬意。如果要说缺点的话,那就是在服务端启动 delve 的 server 端之后,必须在一定时间内(不知道具体多久)连接上它,不然会关闭;同时,在我断开调试之后,server 会自动关闭,如果我要再次调试,那就必须再运行一次 server(当然,可以通过不关闭 debug 解决,就是不太友好)。

具体使用 delve 调试还是比较简单的,只需要两步:

第一步:在服务器上运行 delve 服务器

运行 delve 服务器有几种形式,可以是用 delve 运行 Go 代码,也可以是运行可执行程序,也可以是侵入一个运行中的 Go 程序,一般来说,attach 一个运行中的 Go 程序比较常见:

[[email protected]] dlv attach $PID --headless --api-version=2 --log --listen=:1234

这样 delve 服务器就起来了,然后继续下一步就是 Goland 连接调试。

第二步:在 Goland 中连接 delve 服务器

直接在 Goland 中配置 Host 和 Port 即可,然后在源代码中选择这个 “Go Remote” 调试器进行调试:

注意点:

  • Go 代码需要加上编译选项: -gcflags=‘all=-N -l‘,这个 Goland 也会提示你;
  • 不一定要用 Goland 调试,你也可以在本地执行 delve connect 来连接调试。

有时候我么需要远程调试golang程序,比如我们在macos写的代码,但是有时在linux上运行的,所以我们需要远程调试运行在linux系统的代码。另外一种情况是我们可以把goalng打包到docker 镜像中,代码跑在容器中同样可以调试。以goland为例。

remote debug

远程调试golang代码需要在运行代码的远程机器上按照delve,然后以delve运行要调试的程序。

  • 编译
   export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
   go build -gcflags=‘all -N -l‘ main.go
  • install delve
   go get go get -u github.com/derekparker/delve/cmd/dlv
  • delve 运行程序
 dlv --listen=:2345 --headless=true --api-version=2 exec ./main
  • goland 设置remote debug
    host为远程主机ip 端口是刚才dlv设置的端口

    屏幕快照 2018-07-03 下午3.57.11.png

  • debug
    然后就像调试本地代码一样调试远程主机上的程序

docker debug

原文地址:https://www.cnblogs.com/ExMan/p/11434389.html

时间: 2024-08-25 08:48:56

golang remote debug和docker debug的相关文章

Docker debug调试技巧

『重用』容器名 但我们在编写/调试Dockerfile的时候我们经常会重复之前的command,比如这种docker run --name jstorm-zookeeper zookeeper:3.4,然后就容器名就冲突了. $ docker run --name jstorm-zookeeper zookeeper:3.4 ... $ docker run --name jstorm-zookeeper zookeeper:3.4 docker: Error response from dae

关于debug使用及debug性能报告

日本客户说debug多了会影响性能,即使开关没有开,但要判断很多次的话性能肯定要低,因此这边还是作了实验. 调用下面这个类中的method( )方法. 分别是调用10000次.100000次.1000000次,10000000次的时间上的差异: 调用10000次: 使用LOG4J,并在每个方法开始和结尾都输出DEBUG信息,但是LOG级别设置为INFO的场合: 用时:266mm 不使用LOG4J的场合:用时109mm 两种方式的时间相差:157mm 调用100000次: 使用LOG4J,并在每个

C#在代码中编写输出debug信息-类Debug的使用

文章:C# 的两种debug 方法 文章:C#跟踪和调试程序-Debug类使用 很全面的文章,可以仔细学习使用下. 文章:C#调试类 没有仔细看. 关键字:Debug类和Trace类有什么区别? 微软资料:https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.debug?redirectedfrom=MSDN&view=netframework-4.8 标题:Debug Class 类的作用:提供一组有助于调试代码的方法和属

docker debug diagnose

$ sudo systemctl stop docker $ sudo docker -d -D DEBU[0282] Error contacting registry https://registry-1.docker.io/v1/: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb1

debug.js手机debug类库

https://segmentfault.com/a/1190000000731903#articleHeader3 https://github.com/binnng/debug.js

Hbase 源码调试:Remote debug 模式

不愤不启,不悱不发:举一隅不以三隅反,则不复也. 解释:(教学生)不到他苦思冥想怎么也弄不明白的时候,不去开导他:不到他想说而又说不出来的时候,不去启发他.告诉他(四方形)的一个角,他不能由此推出另外三个角,就不再往下教他(新知识)了. 学习Hbase的开端,就是要了解它的架构,以及HMaster,HRegionServer 的一个启动流程,明白了Hbase内部的基本流程,才能从大局上把握住.明白了Hbase的组成部分,才能在集群出现问题的时候,快速定位到模块,再从模块定位到具体的错误. 下面记

远程debug tomcat

如何用eclispe远程调试tomcat tomcat是一种非常常见的java web应用服务器,有时候服务器可能并不是部署在本地,而是部署在远程其他的机器上,我们用eclispe该如何进行debug调试呢?下面小编就和大家分享一下解决的办法. 方法/步骤 1.在eclispe中新建web应用,项目名字叫web.里面只有一个Servlet类,文件名为info.java.Web.xml配置如下. info.java内容如下, 2.将该项目打成war包,名称为web.war. 3.将web.war复

山石网科-Hillstone-IPsecVPN常见故障debug排错心得终结版

嗨,各位好. 相信各位过来点开的时候会鄙视一句"这厮,又来搞山石了",哈哈没错,这次确实又来了,不过这次带了点排错的心得过来,希望给未来在常见的配置过程当中,不知道怎么排错时候有些帮助. 说句真心话,山石(hillstone)确实挺好用的,不行你可以试试!! 好了,废话少说.直接上菜 ipsec的拓扑图,我临时画了一个,目的希望各位能有图看到,不然各位心里冒出千万个草泥马"NO picture NO bb". (这万恶的水印)无关紧要,今天的主题在俩台firewal

hive启动debug问题

最近在debug hive的一个bug,之前都是使用打印日志来跟踪源码,这种方式效率比较低(每次更改了源码都要重新编译并替换线上的jar包),java的应用可以支持remote debug的,hive也不例外,主要是通过hive --debug来实现. 在运行hive --debug时遇到如下问题: ERROR: Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options