排除应用程序故障是比较复杂的,特别是处理像 Go 这样的高并发语言。它更容易在具体位置使用 print 打印语句来确定程序状态,但是这个方法很难根据条件发展去动态响应你的代码。

调试器提供了一个强大得令人难以置信的故障排除机制。添加排除故障的代码可以巧妙地影响到应用程序该如何运行。调试器可以给正在迷茫的你更精确的看法。

已经有许多 Go 的调试器存在了,其中一些调试器的不好之处是通过在编译时注入代码来提供一个交互终端。gdb 调试器则允许你调试已经编译好的二进制文件,只要他们已经与 debug 信息连接,并不用修改源代码。这是个相当不错的特性,因此你可以从你的部署环境中取一个产品然后灵活地调试它。你可以从Golang 官方文档中关于 gdb 的信息,那么这篇指南将简单讲解使用 gdb 调试器来调试 Go 应用程序的基本用法。

这儿会宣布一些 gdb 的最新更新,最特别的是替换 -> 操作为 . 符号来访问对象属性。记住这儿可能在gdb 和 Go 版本中有细微改变。本篇指南基于 gdb 7.7.1和go 1.5beta2。

开始 gdb 调试

为了实验 gdb 我使用了一个测试程序,完整的源代码可以在gdb_sandbox_on_Github上查看。让我们从一个非常简单的程序开始吧:

我们可以运行这段代码并看到它输出内容的和我们想象的一样:

我们来调试这个程序吧。首先,使用 go build 编译成二进制文件,接着使用这个二进制文件的路径做为参数运行gdb。根据你的设定,你也可以使用source命令来获取 Go 运行时(Go runtime)的支持。现在我们已经在 gdb 的命令行中了,我们可以在运行我们的二进制文件前为它设置断点。

第一关,我们在 for 循环里面设置一个断点(b)来查看执行每次循环时我们的代码会各有什么状态。我们可以使用print(p)命令来检查当前内容的一个变量,还有 list(l)和 backtrace(bt)命令查看当前步骤周围的代码。程序运行时可以使用 next(n)执行下一步或者使用 breakpoint(c)执行到下一个断点。

我们的断点可以设置在关联文件的行号中、GOPATH里的文件的行号或一个包里的��数。如下也是一个有效的断点:

Structs

我们可以用稍微复杂一点的代码来实例演示如何调试。我们将使用f函数生成一个简单的pair,x和y,当x相等时y=f(x),否则=x。

也可以在循环中改变代码来访问这些新函数。

因为我们需要调试的是变量 y。我们可以在y被设置的地方放置断点然后单步执行。可以使用 info args查看函数的参数,在bt之前可以返回当前回溯。

因为我们在变量 y 是在函数 f 中被设定的这样一个条件下,我们可以跳到这个函数的上下文并检查堆区的代码。应用运行时我们可以在一个更高的层次上设置断点并检查其状态。

如果我们在这个断点处继续住下走我们将越过在这个函数中的断点1,而且将立即触发在 HandleNumer 函数中的断点,因为函数 f 只是对变量 i 每隔一次才执行。我们可以通过暂时使断点 2不工作来避免这种情况的发生。

我们也可以分别使用 clear 和 delete breakpoint NUMBER 来清除和删除断点。动态产生和系住断点,我们可以有效地在应用流中来回移动。

Slices and Pointers

上例程序太简单了,只用到了整数型和字符串,所以我们将写一个稍微复杂一点的。首先添加一个slice(切片类型)的指针到 main 函数,并保存生成的 pair,我们后面将用到它。

现在我们来检查生成出来的 slice 或 pairs,首先���们用转换成数组来看一下这个 slice。因为 handleNumber 返回的是一个*pair 类型,我们需要引用这个指针来访问 struct(结构)的属性。

你会发现这里gdb 并不确定 pairs 是一个 slice 类型,我们不能直接访问它的属性,为了访问它的成员我们需要使用 pairs.array 来转换成数组,然后我们就可以检查 slice 的 length(长度)和 capacity(容量):

这时我们可以让它循环几次,并透过这个 slice 不用的成员方法监听增加的 x 和 y 的值,要注意的是,这里的 struct 属性可以通过指针访问,所以 p pairs.array[2].y 一样可行。

Goroutines

现在我们已经可以访问 struct 和 slice 了,下面再来更加复杂一点的程序吧。让我们添加一些goroutines 到 mian 函数,并行处理每一个数字,返回的结果存入信道(chan)中:

如果我等待 WaitGroup 执行完毕再检查 pairs slice 的结果,我们可以预期到内容是完全相同的,虽然它的排序可能有些出入。gdb 真正的威力来自于它可以在 goroutines 正在运行时进行检查:

你会发现我们在 goroutine 要执行的代码段中放置了一个断点,从这里我们可以检查到局部变量,和进程中的其它 goroutines:

在这里我们做的第一件事就是列出所有正在运行的 goroutine,并确定我们正在处理的那一个。然后我们可以看到一些回溯,并发送任何调试命令到 goroutine。这个回溯和列表清单并不太准确,如何让回溯更准确,goroutine 上的 info args显示了我们的局部变量,以及主函数中的可用变量,goroutine 函数之外的使用前缀&。

结论

当调试应用时,gdb 的强大令人难以置信。但它仍然是一个相当新的事物,并不是所有的地方工作地都很完美。使用最新的稳定版 gdb,go 1.5 beta2,有不少地方有突破:

Interfaces

根据 go 博客上的文章, go 的 interfaces 应该已经支持了,这允许在gdb中动态的投影其基类型。这应该算一个突破。

Interface{} 类型

目前没有办法转换 interface{} 为它的类型。

列出 goroutine 的不同点

在其他 goroutine 中列出周边代码会导致一些行数的漂移,最终导致gdb 认为当前的行数超出文件范围并抛出一个错误:

Goroutine 调试还不稳定

处理 goroutines 往往不稳定;我遇到过执行简单命令产生错误的情况。现阶段你应该做好处理类似问题的准备。

gdb 支持 Go 的配置非常麻烦

运行 gdb 支持 Go 调试的配置非常麻烦,获取正确的路径结合与构建 flags,还有 gdb 自动加载功能好像都不能正常的工作。首先,通过一个 gdb 初始化文件加载 Go 运行时支持就会产生初始化错误。这就需要手动通过一个源命令去加载,调试 shell 需要像指南里面描述的那样去进行初始化。

我什么时候该使用一个调试器?

所以什么情况下使用 gdb 更有用?使用 print 语言和调试代码是更有针对性的方法。

当不适合修改代码的时候

当调试一个问题,但是不知道源头,动态断点或许更有效

当包含许多 goroutines 时,暂停然后审查程序状态会更好

GDB 的详细介绍:请点这里

GDB的下载地址:请点这里

Linux系统gdb工具使用,使用 GDB 工具调试 Go相关推荐

  1. LINUX系统程序设计中C/C++编程工具使用

    LINUX系统程序设计中C/C++编程工具使用 一.实验目的 掌握gcc编译器的使用 掌握gdb调试器的使用 掌握make工程管理器的使用 理解Makefile文件的格式,掌握Makefile文件的编 ...

  2. 13 种在 Linux 系统上检测 CPU 信息的工具

    13 种在 Linux 系统上检测 CPU 信息的工具 问题: 我想要了解我的电脑关于CPU处理器的详细信息,查看CPU信息比较有效地方法是什么? 根据你的需要,有各种各样的关于你的CPU处理器信息你 ...

  3. 如何在Linux系统中安装DBeaver通用数据库工具

    DBeaver是一个开源.功能齐全.跨平台的通用数据库管理工具和SQL客户端,可在Linux操作系统.Windows和macOS 系统上运行. DBeaver支持80多个数据库管理系统,包括Postg ...

  4. git管理工具 linux,linux系统下使用流行的版本管理工具 Git

    前几天被版本管理困扰了好久,主要是因为 没法回到之前的版本,新版本又出了问题真的很尴尬. 终于决定使用目前网上很火的版本管理工具-------Git 历史啥的就不说了,说些有用的. 我用的是oschi ...

  5. linux 系统硬件信息检测工具,9种在Linux系统上检测CPU信息的工具

    在Linux中,有许多命令行或基于GUI的工具就能来展示你的CPU硬件的相关具体信息.下面是学习啦小编收集整理的9 种在 Linux 系统上检测 CPU 信息的工具,希望对大家有帮助~~ 9 种在 L ...

  6. 微信开发者工具命令行_在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折.注:带 * 的步骤或文件为不确定是否管用的步骤或文件. 本人系统为Linux ...

  7. 005 Linux系统内存错误产生的原因及调试方法(段错误|core dumped)

    Linux系统内存错误产生的原因及调试方法(段错误|core dumped)[转] Posted on 2008-09-05 14:52 猫头鹰 阅读(84) 评论(0)  编辑 收藏 引用 所属分类 ...

  8. linux 系统后门检测工具,Linux系统的各种后门和日志工具详细介绍[2]

    chfn 提升本地普通用户权限的程序 运行chfn 在它提示输入新的用户名时 如果用户输入rookit密码 他的权限就被提升为root chsh 提升本地用户权限的程序 运行chsh 在它提示输入新的 ...

  9. linux常用命令、linux系统、linux属于什么操作系统、linux系统安装、linux怎么读、linux和windows的区别、linux配置ip地址、linux系统一般用来,在线查询工具

    linux vi编辑器常用命令 linux 查看ip linux find -name 查找文件名 linux shell linux 查看端口占用 linux 删除文件命令 linux cp命令复制 ...

  10. Linux系统制作ios镜像Mondo Rescue工具安装及使用

    项目场景: 提示:这里简述项目相关背景:: 通过Mondo Rescue工具制作当前系统的iso镜像 问题描述 提示:这里描述项目中遇到的问题: 物理机安装linux操作系统后,进行配置及相关操作,保 ...

最新文章

  1. bzoj 3028 生成函数
  2. SSL连接并非完全问题解决
  3. Docker网络相关
  4. 求平方根的算法 牛顿迭代法和二分法
  5. LSGO软件技术团队2015~2016学年第二周(0907~0912)总结
  6. OCP 12c最新考试原题及答案(071-7)
  7. iOS中使用URL Scheme进行App跳转
  8. android 反编译 dex2jar,Android反编译教程:apktool,dex2jar的使用
  9. psd导出jpg太大_Adobe Photoshop CC2017保存技巧 (PS)导出文件过大问题解决
  10. 论文的总结与展望写作技巧
  11. 离开谷歌回归斯坦福,“AI女神”李飞飞新动向揭晓
  12. Android音视频开发之ExoPlayer(一):快速入门ExoPlayer
  13. upc 7834 送礼物
  14. AttributeError: module ‘scipy.signal‘ has no attribute ‘correlation_lags‘
  15. 【转】HttpClient之 addHeader与setHeader
  16. apache的ab压力测试介绍
  17. 电商老大的短腿——阿里巴巴曲折的游戏之路
  18. 华为服务器报警显示F02,华为手机黑屏白字怎么调回来
  19. 广东省新型数据中心发展白皮书
  20. 重装系统(制作系统U盘、安装系统、U盘复原、win10、微PE)

热门文章

  1. robotframework手机号随机产生脚本
  2. android 应用内部组织关系
  3. 构造函数的理解(构造函数与 init 方法)
  4. bzoj1601 [Usaco2008 Oct]灌水
  5. .net堆栈与托管堆的区别
  6. 【JOURNAL】911的虚惊
  7. C++语言map和unordered_map的下标操作
  8. INVALID_HANDLE_VALUE的意思和用法
  9. 主流html5桌面应用开发,主流HTML5开发工具推荐
  10. request和response的setCharacterEncoding()方法