Go语言编译原理之源码调试


Posted in Golang onAugust 05, 2022

前言

在前边几篇文章中分享了Go编译过程中的源码实现,本文主要是想分享一下我是怎么调试Go的源代码的(如果你很熟悉的话,可以跳过本文)。本文主要是分享两种Go源码的调试方法

  • Goland的debug
  • dlv工具

本文我还会以抽象语法树为例,来通过dlv对它的构建过程进行调试

Goland的debug调试Go源码

下边以调试Go编译的入口文件为例

编辑debug配置

Go语言编译原理之源码调试

填写配置信息

Go语言编译原理之源码调试

打断点,并开始执行

Go语言编译原理之源码调试

调试

Go语言编译原理之源码调试

这些调试按钮的功能其实跟其他的IDEA是一样的,之前整理过,这里不重复整理了,不清楚的小伙伴可以看这里

dlv工具调试Go源码

安装

这里以mac为例

brew install dlv

启动

$ dlv debug 待调试文件

常用命令

可以通过下边的方式查看一些常用的命令

$ gc dlv debug /usr/local/go/src/cmd/compile/main.go
Type 'help' for list of commands.
(dlv) help
The following commands are available:
Running the program:
    call ------------------------ (EXPERIMENTAL!!!)恢复进程,注入函数调用(实验的)
    continue (alias: c) --------- 运行到断点或程序终止
    next (alias: n) ------------- 执行下一行.
    rebuild --------------------- 重新生成目标可执行文件并重新启动它. 如果可执行文件不是由dlv构建,它就不能工作.
    restart (alias: r) ---------- 重新启动一个进程.
    step (alias: s) ------------- 单步调试.
    step-instruction (alias: si)  Single step a single cpu instruction.
    stepout (alias: so) --------- Step out of the current function.
Manipulating breakpoints:
    break (alias: b) ------- 设置一个端点.
    breakpoints (alias: bp)  打印所有的端点信息.
    clear ------------------ 清除端点.
    clearall --------------- 删除多个端点.
    condition (alias: cond)  设置断点条件.
    on --------------------- 在命中断点时执行命令.
    toggle ----------------- 打开或关闭断点.
    trace (alias: t) ------- Set tracepoint.
    watch ------------------ Set watchpoint.
Viewing program variables and memory:
    args ----------------- 打印函数参数.
    display -------------- 每次程序停止时打印表达式的值.
    examinemem (alias: x)  检查给定地址的原始内存.
    locals --------------- 打印局部变量.
    print (alias: p) ----- 打印变量值.
    regs ----------------- 打印CPU寄存器的内容.
    set ------------------ 更改变量的值.
    vars ----------------- 打印包变量.
    whatis --------------- 打印表达式的类型.
Listing and switching between threads and goroutines:
    goroutine (alias: gr) -- 显示或更改当前goroutine
    goroutines (alias: grs)  列出程序goroutines.
    thread (alias: tr) ----- 切换到指定的线程.
    threads ---------------- 打印每个跟踪线程的信息.
Viewing the call stack and selecting frames:
    deferred --------- 在延迟调用的上下文中执行命令.
    down ------------- 向下移动当前帧.
    frame ------------ 设置当前帧,或在其他帧上执行命令.
    stack (alias: bt)  打印堆栈信息.
    up --------------- 向上移动当前帧
Other commands:
    config --------------------- 更改配置参数.
    disassemble (alias: disass)  Disassembler.
    dump ----------------------- 从当前进程状态创建核心转储
    edit (alias: ed) ----------- Open where you are in $DELVE_EDITOR or $EDITOR
    exit (alias: quit | q) ----- 退出调试.
    funcs ---------------------- 打印函数列表.
    help (alias: h) ------------ 打印帮助信息.
    libraries ------------------ 列出加载的动态库
    list (alias: ls | l) ------- 展示源代码.
    source --------------------- 执行包含delve命令列表的文件
    sources -------------------- 打印源文件列表
    types ---------------------- 打印类型列表
Type help followed by a command for full documentation.
(dlv)

dlv调试抽象语法树构建

下边利用dlv来调试Go编译过程中的抽象语法树构建。我这里没有粘代码,你可以打开源代码对着下边看

  • 启动dlv,并调试Go编译的入口文件

Go语言编译原理之源码调试

  • 设置断点、continue的使用、n的使用(r 设置编译器编译目标文件)

Go语言编译原理之源码调试

  • 在指定文件的指定位置设置断点

Go语言编译原理之源码调试

  • 打印抽象语法树构建出来的结果(xtop)

Go语言编译原理之源码调试

Go语言编译原理之源码调试

你也可以打印xtop下边元素的值,比如查看xtop第一个元素的左节点

Go语言编译原理之源码调试

以上就是Go语言编译原理之源码调试的详细内容,更多关于Go编译原理源码调试的资料请关注三水点靠木其它相关文章!

Golang 相关文章推荐
golang import自定义包方式
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
Go timer如何调度
Jun 09 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go语言编译原理之变量捕获
Aug 05 #Golang
在ubuntu下安装go开发环境的全过程
Aug 05 #Golang
Go语言测试库testify使用学习
Jul 23 #Golang
Go语言怎么使用变长参数函数
Jul 15 #Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 #Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 #Golang
Go 内联优化让程序员爱不释手
Jun 21 #Golang
You might like
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
了解JavaScript表单操作和表单域
2019/05/27 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
python爬虫正则表达式之处理换行符
2018/06/08 Python
python几种常用功能实现代码实例
2019/12/25 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
Python操作Excel的学习笔记
2021/02/18 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
查摆问题对照检查材料
2014/08/28 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
MySQL RC事务隔离的实现
2022/03/31 MySQL