做为新手,熟练掌握一个好的调试工具,对于我们学习语言或者排查问题的时候,非常有帮助。

你如果使用 VS Code 或者 Goland ,可以直接上手,我就不再写这方面的文章了。

其实相比有用户界面的 IDE 调试工具,我更喜欢简单直接的命令行调试,原因有三点:

  1. 速度快,个人感觉在 Windows 下速度巨慢

  2. 依赖少,在 Linux 服务器上 也能轻松调试

  3. 指令简单,我习惯只使用快捷键就能操作

如果你有和我一样的感受和习惯,可以看下今天的文章,介绍的是 GDB 调试工具。

1. 下载安装 Go

在 Linux 上进行调试,那咱所以得先安装 Go ,由于第一节里只讲了 Windows 的下载安装,并没有讲到在 Linux 上如何安装。所以这里要先讲一下,已经安装过了可以直接跳过。

首先在 go 下载页面上(https://studygolang.com/dl),查看并复制源码包的的下载地址


登陆 linux 机器 ,使用 wget 下载

$ wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz

将下载的源码包解压到 /usr/local 目录下,并设置环境变量

[root@localhost ~]# tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz[root@localhost ~]# [root@localhost ~]# export PATH=$PATH:/usr/local/go/bin[root@localhost ~]# which go/usr/local/go/bin/go[root@localhost ~]# [root@localhost ~]# go versiongo version go1.14.2 linux/amd64[root@localhost ~]# 

2. 开始进行调试

调试使用的是 GDB (好像要求版本 7.1 + ),使用前,请先确保你的机器上已经安装 GDB

[root@localhost code]# which gdb/usr/bin/gdb

准备就绪后,先在目录下写一个测试文件

package main

import "fmt"

func main(){  msg := "hello, world"  fmt.Println(msg)}

然后执行 如下命令进行编译,里面有好多个参数,我还没去了解是什么意思,有疑问的可以自行搜索引擎

$ go build -gcflags "-N -l" demo.go

最后使用 GDB 命令进入调试界面

# 如果你喜欢这种界面的话,用这条命令$ gdb -tui demo

# 如果你跟我一样不喜欢不习惯用界面,就使用这个命令$ gdb demo

完整操作如下:


进入 GDB 调试界面后,并不是立即可用,你先需要回车,然后再你敲入几行命令,调试窗口就会出现代码。

(gdb) b    main.main   # 在 main 包里的 main 函数 加断点Breakpoint 1 at    0x4915c0: file /home/wangbm/code/demo.go, line 5.(gdb) run  # 执行进程Starting program: /home/wangbm/code/demo Breakpoint 1, main.main () at /home/wangbm/code/demo.go:5(gdb) 
使用界面如下

3. 详解调试指令

要熟练使用 GDB ,你得熟悉的掌握它的指令,这里列举一下

  • r:run,执行程序

  • n:next,下一步,不进入函数

  • s:step,下一步,会进入函数

  • b:breakponit,设置断点

  • l:list,查看源码

  • c:continue,继续执行到下一断点

  • bt:backtrace,查看当前调用栈

  • p:print,打印查看变量

  • q:quit,退出 GDB

  • whatis:查看对象类型

  • info breakpoints:查看所有的断点

  • info locals:查看局部变量

  • info args:查看函数的参数值及要返回的变量值

  • info frame:堆栈帧信息

  • info goroutines:查看 goroutines 信息。在使用前 ,需要注意先执行 /usr/local/go/src/runtime/runtime-gdb.py

  • goroutine 1 bt:查看指定序号的 goroutine 调用堆栈

  • 回车:重复执行上一次操作

其中有几个指令的使用比较灵活

比如 l - list,查看代码

# 查看指定行数上下5行(gdb) l 8

# 查看指定范围的行数(gdb) l 5:8

# 查看指定文件的行数上下5行l demo.go:8

# 可以查看函数,记得加包名l main.main

把上面的 l 换成 b ,大多数也同样适用

# 在指定行打断点(gdb) b 8

# 在指定指定文件的行打断点b demo.go:8

# 在指定函数打断点,记得加包名b main.main

还有 p - print,打印变量

# 查看变量(gdb) p var

# 查看对象长度或容量(gdb) p $len(var)(gdb) p $cap(var)

# 查看对象的动态类型(gdb) p $dtype(var)(gdb) iface var

# 举例如下(gdb) p i$4 = {str = "cbb"}(gdb) whatis itype = regexp.input(gdb) p $dtype(i)$26 = (struct regexp.inputBytes *) 0xf8400b4930(gdb) iface iregexp.input: struct regexp.inputBytes *

以上就是关于 GDB 的使用方法,非常简单,可以自己手动敲下体验一下。

推荐阅读

  • 2020重学Go系列:29. 盘一盘 Go 语言中的编码规范


喜欢本文的朋友,欢迎关注“Go语言中文网”:

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

c++ gdb 绑定源码_2020重学Go系列:30. 非常详细的 Go 语言 GDB 调试指南相关推荐

  1. go 函数名之前括号中的内容_2020 重学 Go 系列:09. 一篇文章理解 Go 里的函数

    1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构.将一段功能复杂.很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性. 在 Go 语言中,函数可以分为两种: 带 ...

  2. c++ gdb 绑定源码_【Vue原理】VNode 源码版

    ↑点击上方 "神仙朱" 一起研究Vue源码吧 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版 ...

  3. c++ gdb 绑定源码_第18篇:C++ 静态绑定和动态绑定

    编译程序时,C ++编译器对源代码中的每个语句转换为一行或多行机器语言. 我们从之前的汇编基础系列和内存管理文章中,已经知道每行机器语言都有其自己的唯一的顺序地址. 由于函数也是一个数据对象,它也将转 ...

  4. 易语言调用大漠插件对雷电模拟器进行后台绑定源码

    在 易语言大漠对雷电模拟器中控后台的绑定介绍了对雷电模拟器的绑定,这里再介绍一个方法,扩充一下大漠对雷电模拟器的后台绑定. 绑定源码: .版本 2 .支持库 spechwnd = FindWindow ...

  5. HTML5期末大作业:花店购物网站设计——花店购物网站源码(27页) 学生动花店购物页设计模板下载 植物大学生HTML网页制作作品 简单网页设计成品 dreamweaver学生网站模板

    HTML5期末大作业:花店购物网站设计--花店购物网站源码(27页) 学生动花店购物页设计模板下载 植物大学生HTML网页制作作品 简单网页设计成品 dreamweaver学生网站模板 常见网页设计作 ...

  6. v55.04 鸿蒙内核源码分析(重定位) | 与国际接轨的对外发言人 | 百篇博客分析HarmonyOS源码

    子张问善人之道.子曰:"不践迹,亦不入于室." <论语>:先进篇 百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外发言人 加载 ...

  7. 自适应app下载页-源码分享-趣学程序

    自适应app下载页-源码分享-趣学程序 hello,大家好,我是shaofeer,今天给大家分享常用的<app下载页面>的源码,希望对大家有所帮助. 本文中涉及到的源码,获取方式在文末哦~ ...

  8. 《重学Java系列》之 注解基础

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/104432728] <重 ...

  9. 《重学Java系列》之 反射(上)

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/103350829] <重学 ...

最新文章

  1. VB6 通过winsock控件数组实现客户端和服务器多对一通信
  2. (原)torch中微调某层参数
  3. Jsoup设置元素的文本内容
  4. SQL Server删除语句
  5. #CSP 201509-1 数列分段(100分)
  6. js文件/图片从电脑里面拖拽到浏览器上传文件/图片
  7. 【数据结构与算法】完结
  8. SQlite Android数据库的应用 Android SQLite 简易的学生成绩管理系统
  9. springboot默认数据源如何设置连接数_Spring Boot学习:如何使用Druid数据源
  10. 项目管理第六章项目进度管理
  11. Cypress Test
  12. 生产企业全流程生产管控_如何通过创建流程使生产率提高10倍
  13. 求求你,别在MySQL中使用UTF-8了!
  14. 淘宝网店如何提升无线端宝贝权重,抢占更多无线流量?
  15. 1.8 信息系统服务管理
  16. TDSQL:腾讯金融级分布式数据库解决方案
  17. TYVJ P1092 麻将
  18. MATLAB 基础知识 数据类型 表 添加和删除表行
  19. HTML5.0实例练习(三) --制作一个简单登陆界面
  20. 焦点与焦距 (focal point, focal length)

热门文章

  1. 使用GetValue和SetValue来设置属性
  2. STAR-GCN:用于推荐系统的图卷积神经网络 IJCAI 2019
  3. Java集合系列---List源码解析(ArrayList和LinkedList的区别)
  4. python语言名片管理系统,进行增删改查
  5. iis7 php 文件 不可写,PHP配置文件不會加載IIS7 x64
  6. 只腐蚀毛刺 腐蚀算法_去毛刺更省时省力的方式方法大全!
  7. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 26 章 高可用、负载均衡和复制_26.4. 日志传送的替代方法...
  8. php判断是否为手机设备
  9. 一篇图像识别的科普文
  10. “Device eth0 does not seem to be present”解决办法