码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

无论哪种方式,都要配置证书相关,参考这篇文章:在Mac安装最新gdb的详细教程,含可能遇到的所有坑(网上最新教程)_偕臧-CSDN博客

  1. 钥匙串中,创建gdb代码签名系统证书
  2. 证书授权 codesign -fs gdb_codesign /usr/local/bin/gdb
  3. .gdbinit配置文件添加 set startup-with-shell off 关闭shell缓存
  4. 关闭 MacOS 系统的 SIP 安全验证

代码

package mainimport ("fmt"
)func a(){fmt.Println(111);
}func main() {a()s := []int{1, 2}s = append(s, 3, 4, 5)fmt.Println(len(s), cap(s))
}

dlv

GO语言调试利器——dlv - 简书

si要进入runtime函数,必须提前打好断点,也就是说假如我们不知道调用哪个内核函数的情况下,是无法调试runtime函数的,此时如果需要调试runtime需要使用gdb

help可查看各种命令

调试过程

1.dlv debug运行

dlv debug main.go 

2. main函数入口加断点

(dlv) b main.go:11

3. r 运行

(dlv) r
Process restarted with PID 1235

4. c 跳到第一个断点处

(dlv) c
> main.main() ./main.go:11 (hits goroutine(1):1 total:1) (PC: 0x10bfaf8)6:7: func a(){8:         fmt.Println(111);9: }10:
=>  11: func main() {12:         a()13:         s := []int{1, 2}14:         s = append(s, 3, 4, 5)15:         fmt.Println(len(s), cap(s))16: }
(dlv) 

5. 反复n,直到执行到 append函数

(dlv) n
> main.main() ./main.go:14 (PC: 0x10bfb55)9: }10:11: func main() {12:         a()13:         s := []int{1, 2}
=>  14:         s = append(s, 3, 4, 5)15:         fmt.Println(len(s), cap(s))16: }

6. si 跳不进去

(dlv) si
> main.main() ./main.go:14 (PC: 0x10bfb5e)9: }10:11: func main() {12:         a()13:         s := []int{1, 2}
=>  14:         s = append(s, 3, 4, 5)15:         fmt.Println(len(s), cap(s))16: }
(dlv) 

7. b runtime.growslice 然后再 s

(dlv) b runtime.growslice
Breakpoint 2 set at 0x1042913 for runtime.growslice() /usr/local/go/src/runtime/slice.go:76
(dlv) s
> runtime.growslice() /usr/local/go/src/runtime/slice.go:76 (hits goroutine(1):1 total:1) (PC: 0x1042913)
Warning: debugging optimized function71: // NOT to the new requested capacity.72: // This is for codegen convenience. The old slice's length is used immediately73: // to calculate where to write new values during an append.74: // TODO: When the old backend is gone, reconsider this decision.75: // The SSA backend might prefer the new length or to return only ptr/cap and save stack space.
=>  76: func growslice(et *_type, old slice, cap int) slice {77:         if raceenabled {78:                 callerpc := getcallerpc()79:                 racereadrangepc(old.array, uintptr(old.len*int(et.size)), callerpc, funcPC(growslice))80:         }81:         if msanenabled {
(dlv) 

gdb

即使不加断点,也可以进入runtime内核代码

调试过程

  • 使用 -gcflags=all="-N -l" 禁用内联优化方便后面调试
  • 如果不加 -ldflags='-compressdwarf=false' 在调试时可能会提示 No symbol table is loaded. Use the "file" command.
go build -gcflags=all="-N -l" -ldflags='-compressdwarf=false' -o main main.go 

关键断点

go tool compile -S main.go

程序入口

(gdb) info files
Symbols from "/home/users/weihaoyu/go/own/t".
Local exec file:`/home/users/weihaoyu/go/own/t', file type elf64-x86-64.Entry point: 0x465b500x0000000000401000 - 0x00000000004adba3 is .text0x00000000004ae000 - 0x00000000004ee220 is .rodata0x00000000004ee3e0 - 0x00000000004eee8c is .typelink0x00000000004eee90 - 0x00000000004eeee0 is .itablink0x00000000004eeee0 - 0x00000000004eeee0 is .gosymtab0x00000000004eeee0 - 0x00000000005649d9 is .gopclntab0x0000000000565000 - 0x0000000000565020 is .go.buildinfo0x0000000000565020 - 0x00000000005730c0 is .noptrdata0x00000000005730c0 - 0x000000000057a1d0 is .data0x000000000057a1e0 - 0x00000000005a3b70 is .bss0x00000000005a3b80 - 0x00000000005a63c8 is .noptrbss0x0000000000400f9c - 0x0000000000401000 is .note.go.buildid
(gdb) b *0x465b50

sudo 运行 gdb

sudo gdb -tui ./main

按 l 显示代码

This GDB was configured as "x86_64-apple-darwin18.5.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.--Type <RET> for more, q to quit, c to continue without paging--l
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./main...
Loading Go Runtime support.
(gdb) l
(gdb) 

添加断点到main入口

(gdb) b main.go:11
Breakpoint 1 at 0x10bfae0: file /Users/why/Desktop/go/test/main.go, line 11.
(gdb) 

r 运行

(gdb) r
Starting program: /Users/why/Desktop/go/test/main
[New Thread 0x1203 of process 1292]
[New Thread 0xf03 of process 1292]
warning: unhandled dyld version (16)
[New Thread 0x1107 of process 1292]
[New Thread 0x1503 of process 1292]
[New Thread 0x1603 of process 1292]
[New Thread 0x2803 of process 1292]
[New Thread 0x2903 of process 1292]Thread 2 hit Breakpoint 1, main.main () at /Users/why/Desktop/go/test/main.go:11
(gdb) 

一路 n 到 append 然后 s 就可以跳进去,不需要提前加断点

gdb常用命令

  • b:添加断点
  • info b:查看断点列表
  • delete [num]:删除某个断点
  • info locals:查看变量
  • info args:查看函数入参和出参
  • info goroutines:查看 goroutines 信息
  • goroutines 1 bt:查看某个 goroutines 调用栈
  • r:开始执行
  • l:查看代码
  • n:单步执行,遇到函数不会进入
  • s:单步执行,遇到函数会进入
  • c:执行到下一个断点
  • focus:可视化代码
  • Ctrl+x+a:退出可视化
  • bt:查看调用栈
  • p:打印某个变量
  • q:退出

gdb命令手册:linux中GDB详细使用手册_AndrewYZWang的博客-CSDN博客_gdb手册

手把手教你用dlv和gdb调试GoLang相关推荐

  1. gdb调试golang方法

    gdb常用指令 :start 开始调试,停在第一行代码处,(gdb)start info br 显示当前已有断点 clear clear 750删除750行所有断点 l list的缩写查看源代码,(g ...

  2. 手把手教你获取、编译和调试Flink的源代码

    导读:本文介绍如何导入Flink源代码,对源代码进行编译.构建及调试. 作者:罗江宇 赵士杰 李涵淼 闵文俊 来源:大数据DT(ID:hzdashuju) 01 获取与导入Flink源代码 1. 下载 ...

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

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

  4. 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)

    手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...

  5. 网络分析仪测试线损_手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修...

    原标题:手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修 本文和大家介绍测试阻抗的方法是反射法,适用于经典的低阻抗到中阻抗范围,通过S参数测量端口测试. 图1:2端口网络分析仪E5061 ...

  6. 手把手教你用Vscode Debugger调试代码

    http://shooterblog.site/2018/05/19/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E7%94%A8Vscode%20De ...

  7. 手把手教你写一个串口调试助手

    硬件攻城狮 2022-05-20 14:05 发表于广东 果果小师弟. 电子信息工程硕士在读,分享单片机.嵌入式linux.物联网等知识,致力于打造最硬核的嵌入式技术公众号. 摘要:前段时间发布了一个 ...

  8. 【GDB】手把手教你用gdb调试程序(超清晰流程)

    实例 我以自己曾经写的一段实际代码为例,来讲解究竟该怎么进行GDB调试. 实例地址: GitHub:https://github.com/yngzMiao/protobuf-parser-tool 实 ...

  9. 关于DevC++如何调试的问题,还不会调试的同学看这里--->>>超级详细调试教程,手把手教你如何调试

    关于devc++调试问题,还不会调试的同学看这里!!!超级详细调试教程,手把手教你如何调试 DevC++该如何调试? 这篇是关于Devc该如何调试的. 刚接触c语言的同学可能还不会调试,所以我在这里就 ...

最新文章

  1. 【Qt】Qt样式表总结(二):冲突和命名空间
  2. LeetCode77:Combinations
  3. 安装mysql的过程可以中断吗_安装 mysql 遇到的坑(附 mysql 安装过程)
  4. 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
  5. Visual Studio会让嵌入式开发变得更香
  6. 获取少女资源.html,战舰少女资源怎么得 资源来源汇总
  7. windows 保护色设置
  8. 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
  9. filter函数 与filtfilt函数的效果区别
  10. GIF:推荐两款好用的gif免费制作软件
  11. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
  12. 2015 iMac如何绕过TMP安装Windows11(不用Parallels虚拟机实现macOS与Windows11双系统)
  13. VB写的软件加壳都没用,超强反调试反破解分析,检测OD调试器
  14. 基于深度摄像头的障碍物检测(realsense+opencv)
  15. 对 Linux 初级、中级、高级用户非常有用的 60 个命令
  16. AutoService+javaPoet+maven+注解自动生成java代码
  17. ubuntu 安装飞秋
  18. php微信分享无效签名,关于微信链接分享一直报签名无效的问题
  19. gitbook 插件 图标与LOGO
  20. Vue使用vis实现拓扑图

热门文章

  1. Java-Quartz实现定时任务(SpringBoot整合quartz)
  2. yum makecache生成缓存时报错One of the configured repositories failed (this is centos.repo), and yum doesn‘
  3. mac 下 zmp编译
  4. android Bluetooth常用AT 命令手册
  5. 2019年CCSU训练赛一(A到L题解)
  6. 如何用阿里云服务器搭建个人博客网站?
  7. 常见随机变量的概率分布
  8. TensorFlow入门教程:14:噪声数据: 随机分布
  9. 基于机器学习算法的微博评论情感分析实战(毕设项目)
  10. (附源码)spring boot西安市中小学生护眼平台开发 毕业设计080855