手把手教你用dlv和gdb调试GoLang
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071
无论哪种方式,都要配置证书相关,参考这篇文章:在Mac安装最新gdb的详细教程,含可能遇到的所有坑(网上最新教程)_偕臧-CSDN博客
- 钥匙串中,创建gdb代码签名系统证书
- 证书授权 codesign -fs gdb_codesign /usr/local/bin/gdb
- .gdbinit配置文件添加 set startup-with-shell off 关闭shell缓存
- 关闭 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相关推荐
- gdb调试golang方法
gdb常用指令 :start 开始调试,停在第一行代码处,(gdb)start info br 显示当前已有断点 clear clear 750删除750行所有断点 l list的缩写查看源代码,(g ...
- 手把手教你获取、编译和调试Flink的源代码
导读:本文介绍如何导入Flink源代码,对源代码进行编译.构建及调试. 作者:罗江宇 赵士杰 李涵淼 闵文俊 来源:大数据DT(ID:hzdashuju) 01 获取与导入Flink源代码 1. 下载 ...
- cgdb 调试_在MacOS上使用gdb(cgdb)调试Golang程序
如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...
- 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)
手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...
- 网络分析仪测试线损_手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修...
原标题:手把手教你用2端口网络分析仪进行阻抗调试分析--网络分析仪维修 本文和大家介绍测试阻抗的方法是反射法,适用于经典的低阻抗到中阻抗范围,通过S参数测量端口测试. 图1:2端口网络分析仪E5061 ...
- 手把手教你用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 ...
- 手把手教你写一个串口调试助手
硬件攻城狮 2022-05-20 14:05 发表于广东 果果小师弟. 电子信息工程硕士在读,分享单片机.嵌入式linux.物联网等知识,致力于打造最硬核的嵌入式技术公众号. 摘要:前段时间发布了一个 ...
- 【GDB】手把手教你用gdb调试程序(超清晰流程)
实例 我以自己曾经写的一段实际代码为例,来讲解究竟该怎么进行GDB调试. 实例地址: GitHub:https://github.com/yngzMiao/protobuf-parser-tool 实 ...
- 关于DevC++如何调试的问题,还不会调试的同学看这里--->>>超级详细调试教程,手把手教你如何调试
关于devc++调试问题,还不会调试的同学看这里!!!超级详细调试教程,手把手教你如何调试 DevC++该如何调试? 这篇是关于Devc该如何调试的. 刚接触c语言的同学可能还不会调试,所以我在这里就 ...
最新文章
- 【Qt】Qt样式表总结(二):冲突和命名空间
- LeetCode77:Combinations
- 安装mysql的过程可以中断吗_安装 mysql 遇到的坑(附 mysql 安装过程)
- 什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
- Visual Studio会让嵌入式开发变得更香
- 获取少女资源.html,战舰少女资源怎么得 资源来源汇总
- windows 保护色设置
- 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
- filter函数 与filtfilt函数的效果区别
- GIF:推荐两款好用的gif免费制作软件
- RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
- 2015 iMac如何绕过TMP安装Windows11(不用Parallels虚拟机实现macOS与Windows11双系统)
- VB写的软件加壳都没用,超强反调试反破解分析,检测OD调试器
- 基于深度摄像头的障碍物检测(realsense+opencv)
- 对 Linux 初级、中级、高级用户非常有用的 60 个命令
- AutoService+javaPoet+maven+注解自动生成java代码
- ubuntu 安装飞秋
- php微信分享无效签名,关于微信链接分享一直报签名无效的问题
- gitbook 插件 图标与LOGO
- Vue使用vis实现拓扑图
热门文章
- Java-Quartz实现定时任务(SpringBoot整合quartz)
- yum makecache生成缓存时报错One of the configured repositories failed (this is centos.repo), and yum doesn‘
- mac 下 zmp编译
- android Bluetooth常用AT 命令手册
- 2019年CCSU训练赛一(A到L题解)
- 如何用阿里云服务器搭建个人博客网站?
- 常见随机变量的概率分布
- TensorFlow入门教程:14:噪声数据: 随机分布
- 基于机器学习算法的微博评论情感分析实战(毕设项目)
- (附源码)spring boot西安市中小学生护眼平台开发 毕业设计080855