1 GDB与Delve

Gdb无法很好的支持golang的协程机制,delve为golang而生。Why?

GDB does not understand Goprograms well. The stack management, threading, and runtime contain aspectsthat differ enough from the execution model GDB expects that they can confusethe debugger, even when the program is compiled with gccgo.

In short, the instructions belowshould be taken only as a guide to how to use GDB when it works, not as aguarantee of success.

In time, a more Go-centric debugging architecture may be required.

总结一下上面说的话。

  1. Go 的debug工具有GDB这个玩意,但是目前貌似工作的不咋滴
  2. 目前官方只是给你介绍介绍这个玩意怎么用,但是不保证能成功
  3. 实话说,我们需要一个更懂 Go 的调试器

最后一句话透露了本质,目前还没有一个非常好的调试工具。难道我们只能在不断打日志然后 build 然后再打日志中调试程序吗?当然不是,下面我来介绍一个专门为 Go而生的 debug 工具 Delve。

Delve目的就是为了解决开发者在使用 GDB 调试中遇到的各种各样的问题。

2 delve初级使用

常用命令

2.1 直接debug

vim mstest.go

package main
import ("fmt""sync""time"
)
func dostuff(wg *sync.WaitGroup, i int) {fmt.Printf("goroutine id %d\n", i)time.Sleep(300 * time.Second)fmt.Printf("goroutine id %d\n", i)wg.Done()
}
func main() {var wg sync.WaitGroupworkers := 10wg.Add(workers)for i := 0; i< workers; i++ {go dostuff(&wg, i)}wg.Wait()
}
使用命令dlv debug mstest.go  ,  对上面的代码进行调试。

2.2 attach 到已经在运行的程序上

[root@wangyoujin bin]# dlv attach 27419

Type 'help' for list of commands.

(dlv) b main.main

Breakpoint 1 set at 0x856778 formain.main() /home/wangyoujin/18code/nb-iot-platform-able/src/ac-lwm2m/main.go:22

(dlv) n

> runtime.futex()/usr/lib/golang/src/runtime/sys_linux_amd64.s:427 (PC: 0x467157)

(dlv) break/home/wangyoujin/18code/nb-iot-platform-able/src/ac-lwm2m/main.go:22

Command failed: Breakpoint exists at/home/wangyoujin/18code/nb-iot-platform-able/src/ac-lwm2m/main.go:22 at 856778

(dlv) clear

Command failed: notenough arguments

(dlv) clearall

Breakpoint 1 cleared at0x856778 for main.main()/home/wangyoujin/18code/nb-iot-platform-able/src/ac-lwm2m/main.go:22

(dlv) break/home/wangyoujin/18code/nb-iot-platform-able/src/ac-common-go/dtls/listener.go:96

s, err := l.openSSL(addr)
if err != nil {log.Printf("open ssl: %v", err)continue
}

Breakpoint 2 set at 0x77e393 forac-common-go/dtls.(*listener).reading()/home/wangyoujin/18code/nb-iot-platform-able/src/ac-common-go/dtls/listener.go:96

(dlv) c

>ac-common-go/dtls.(*listener).reading()/home/wangyoujin/18code/nb-iot-platform-able/src/ac-common-go/dtls/listener.go:96(hits goroutine(85):1 total:1) (PC: 0x77e393)

(dlv) print s   //查看此处 变量s的内容

*ac-common-go/dtls.ssl {

w:io.Writer(*ac-common-go/dtls.peerWriter) *{

conn:net.PacketConn(*net.UDPConn) ...,

addr:net.Addr(*net.UDPAddr) ...,},

addr:net.Addr(*net.UDPAddr) *{

IP:net.IP len: 16, cap: 16, [0,0,0,0,0,0,0,0,0,0,255,255,127,0,0,1],

Port: 56752,

Zone:"",},

closed:0,

istream:chan []uint8 {

qcount:0,

dataqsiz:8,

buf:unsafe.Pointer(0xc4201d5b00),

elemsize:24,

closed:0,

elemtype:*runtime._type {

size:24,

ptrdata:8,

hash:942571231,

tflag:2,

align:8,

fieldalign:8,

kind:23,

alg:*(*runtime.typeAlg)(0xde7400),

gcdata:*1,

str:23644,

ptrToThis:214400,},

sendx:0,

recvx:0,

recvq:waitq<[]uint8> {

first:*sudog<[]uint8> nil,

last:*sudog<[]uint8> nil,},

sendq:waitq<[]uint8> {

first:*sudog<[]uint8> nil,

last:*sudog<[]uint8> nil,},

lock:runtime.mutex {key: 0},},

ostream:chan ac-common-go/dtls.result {

qcount:0,

dataqsiz:256,

buf:unsafe.Pointer(0xc4202de000),

elemsize:56,

closed:0,

elemtype:*runtime._type {

size:56,

ptrdata:40,

hash:1442787700,

tflag:7,

align:8,

fieldalign:8,

kind:25,

alg:*(*runtime.typeAlg)(0xde7400),

gcdata:*31,

str:50567,

ptrToThis:220096,},

sendx:3,

recvx:3,

recvq:waitq<ac-common-go/dtls.result> {

first:*(*sudog<ac-common-go/dtls.result>)(0xc4201db1d0),

last:*(*sudog<ac-common-go/dtls.result>)(0xc4201db1d0),},

sendq:waitq<ac-common-go/dtls.result> {

first:*sudog<ac-common-go/dtls.result> nil,

last:*sudog<ac-common-go/dtls.result> nil,},

lock:runtime.mutex {key: 0},},

session:ac-common-go/dtls.session {

mu:(*sync.Mutex)(0xc42043b0b8),

bio:ac-common-go/dtls.bio(*ac-common-go/dtls.ssl) ...,

session:*(*ac-common-go/dtls._Ctype_struct_dtls_session)(0x7fe250009760),},}

(dlv) c

> ac-common-go/dtls.(*listener).reading()/home/wangyoujin/18code/nb-iot-platform-able/src/ac-common-go/dtls/listener.go:96(hits goroutine(85):2 total:2) (PC: 0x77e393)

(dlv) clearall

Breakpoint 2 cleared at 0x77e393 forac-common-go/dtls.(*listener).reading() /home/wangyoujin/18code/nb-iot-platform-able/src/ac-common-go/dtls/listener.go:96

(dlv) continue

delve 调试golang相关推荐

  1. delve应该安装到哪_使用 delve 调试 golang 程序

    安装 delve 官方的文档已经很全了,参考这里(github)安装.Mac OSX 比较麻烦,需要搞定证书. 断点和变量打印 delve 装好之后就可以直接在命令行使用 dlv 命令了. 查看可用的 ...

  2. 使用Delve进行Golang代码的调试

    dlv  git 仓库: https://github.com/go-delve/delve/tree/master/Documentation/installation Delve目的就是为了解决开 ...

  3. mac pro下安装gdb和delve调试器

    2019独角兽企业重金招聘Python工程师标准>>> 我用liteide进行go环境的配置,最近升级以后发现两个调试器都不能debug代码 了,主要原因有两个.一个是软件签名问题和 ...

  4. 是否要运行此应用程序_使用Delve调试Go应用程序

    调试器 任何编程语言中最简单的调试形式是使用打印语句或日志来写入标准输出.这肯定没有问题,但是当我们的应用程序规模增加并且逻辑变得更加复杂时,这种方式变得极其困难.将打印语句添加到应用程序的每个代码路 ...

  5. delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world

    前面几周陆陆续续写了一些后端技术的文章,包括数据库.微服务.内存管理等等,我比较倾向于成体系的学习,所以数据库和微服务还有后续系列文章补充. 最近工作上比较多的 Golang 编程,现在很多互联网公司 ...

  6. cgdb 调试_在MacOS上使用gdb(cgdb)调试Golang程序

    如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...

  7. 使用Delve调试Go应用程序

    需要调试器 任何编程语言中最简单的调试形式是使用打印语句/日志并写入标准输出.这肯定可以工作,但是当我们的应用程序规模增加并且逻辑变得更加复杂时,它变得极其困难.将打印语句添加到应用程序的每个代码路径 ...

  8. dlv调试golang

    dlv调试golang 调试所用代码 dlv trace追踪调用轨迹 调试模式 调试模式基本命令 1.打断点: 2.带条件的断点 3.查看所有断点 4.重启当前进程 5.继续执行到断点处 6.逐行执行 ...

  9. vscode利用delve调试go1.12代码

    目前vscode里调试go利用的是delve工具,最新delve仅支持调试go1.14及以上版本的代码,但有时有需要用较低版本golang,不方便升级golang. 解决方案之一是在launch.js ...

最新文章

  1. 【深度学习】基于Pytorch进行深度神经网络计算(二)
  2. 外链对网站SEO优化起什么作用?
  3. Android之Providing Resources(提供资源)
  4. 简单记录一下fabric版本1.4的环境搭建,
  5. 八月22日,django知识点总结:
  6. 顺序表查找+折半查找(二级)
  7. python实现弹幕_python实现b站直播自动发送弹幕功能
  8. C——通过调用函数分配内存
  9. ucenter php7.0版,UCenter1.5.0/UCenter Home1.5/Discuz! 7.0
  10. splitlines
  11. Direct3D 9学习笔记(3)基本顶点绘制
  12. Servlet — 如何让服务器控制浏览器10秒后跳转到另一个页面
  13. 网络教育统考计算机和英语作文,网络教育英语统考试题
  14. Robot Rapping Results Report CodeForces - 645D
  15. 百度网盘分享旁边的个人说明如何修改
  16. 数据仓库分层 (ODS、DWD、DWS)
  17. 【VSCode常用插件】Path Autocomplete(@路径提示的插件)
  18. Linux C/C++ 调试的那些“歪门邪道”
  19. 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-(一千零一拾一元整)输出
  20. linux学习笔记(十一)-----linux中的虚拟机管理

热门文章

  1. KP-ABE和CP-ABE(步骤详细讲解)
  2. 长虹电视安装第三方软件2021最新方法!
  3. plt.rcParams属性总结
  4. 【数据科学】数据分析的思维训练
  5. 数据结构——Prim法最小树生成
  6. OpenFOAM——设置自定义非均匀场区域
  7. 基于HEC-RAS数值模拟与GIS水文分析技术的洪水危险性及风险评估
  8. 一文带你认识进行用户细分的原则
  9. 空想科学教程 (爆笑)3
  10. v-if与perssimion结合实现权限控制