原文:http://www.cnblogs.com/yourihua/archive/2012/06/15/2541745.html

说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试?

其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能会调出有问题。更好的调试方式是跟PHP这种语言一样,用打印的方式(日志或print)。

当然,简单的小程序,如果单步调试,可以看到一些内部的运行机理,对于学习还是挺有好处的。下面介绍一下用GDB调试Go程序:(目前IDE支持调试Go程序,用的也是GDB。要求GDB 7.1以上)

以下内容来自雨痕的《Go语言学习笔记》(下载Go资源):

默认情况下,编译过的二进制文件已经包含了 DWARFv3 调试信息,只要 GDB7.1 以上版本都可以进行调试。 在OSX下,如无法执行调试指令,可尝试用sudo方式执行gdb。

删除调试符号:go build -ldflags “-s -w”

  • -s: 去掉符号信息。
  • -w: 去掉DWARF调试信息。

关闭内联优化:go build -gcflags “-N -l”

调试相关函数:

  • runtime.Breakpoint():触发调试器断点。
  • runtime/debug.PrintStack():显示调试堆栈。
  • log:适合替代 print显示调试信息。

GDB 调试支持:

  • 参数载入:gdb -d $GCROOT 。
  • 手工载入:source pkg/runtime/runtime-gdb.py。

更多细节,请参考: http://golang.org/doc/gdb

调试演示:(OSX 10.8.2, Go1.0.3, GDB7.5.1)

1 package main
2  
3 import (
4     "fmt"
5     "runtime"
6 )
7  
8 func test(s string, x int) (r string) {
9     r = fmt.Sprintf("test: %s %d", s, x)
10     runtime.Breakpoint()
11     return r
12 }
13 func main() {
14     s := "haha"
15     i := 1234
16     println(test(s, i))
17 }

$ go build -gcflags “-N -l” // 编译,关闭内联优化。

$ sudo gdb demo // 启动 gdb 调试器,手工载入 Go Runtime 。
GNU gdb (GDB) 7.5.1
Reading symbols from demo…done.
(gdb) source /usr/local/go/src/pkg/runtime/runtime-gdb.py
Loading Go Runtime support.

(gdb) l main.main // 以 .方式查看源码。
9 r = fmt.Sprintf(“test: %s %d”, s, x)
10 runtime.Breakpoint()
11 return r
12 }
13
14 func main() {
15 s := “haha”
16 i := 1234
17 println(test(s, i))
18 }

(gdb) l main.go:8 // 以 :方式查看源码。
3 import (
4 “fmt”
5 “runtime”
6 )
7
8 func test(s string, x int) (r string) {
9 r = fmt.Sprintf(“test: %s %d”, s, x)
10 runtime.Breakpoint()
11 return r
12 }

(gdb) b main.main // 以 .方式设置断点。
Breakpoint 1 at 0×2131: file main.go, line 14.

(gdb) b main.go:17 // 以 :方式设置断点。
Breakpoint 2 at 0×2167: file main.go, line 17.

(gdb) info breakpoints // 查看所有断点。
Num Type Disp Enb Address What
1 breakpoint keep y 0×0000000000002131 in main.main at main.go:14
2 breakpoint keep y 0×0000000000002167 in main.main at main.go:17

(gdb) r // 启动进程,触发第一个断点。
Starting program: demo
[New Thread 0x1c03 of process 4088]
[Switching to Thread 0x1c03 of process 4088]
Breakpoint 1, main.main () at main.go:14
14 func main() {

(gdb) info goroutines // 查看 goroutines 信息。
* 1 running runtime.gosched
* 2 syscall runtime.entersyscall

(gdb) goroutine 1 bt // 查看指定序号的 goroutine 调用堆栈。
#0 0x000000000000f6c0 in runtime.gosched () at pkg/runtime/proc.c:927
#1 0x000000000000e44c in runtime.main () at pkg/runtime/proc.c:244
#2 0x000000000000e4ef in schedunlock () at pkg/runtime/proc.c:267
#3 0×0000000000000000 in ?? ()

(gdb) goroutine 2 bt // 这个 goroutine 貌似跟 GC 有关。
#0 runtime.entersyscall () at pkg/runtime/proc.c:989
#1 0x000000000000d01d in runtime.MHeap_Scavenger () at pkg/runtime/mheap.c:363
#2 0x000000000000e4ef in schedunlock () at pkg/runtime/proc.c:267
#3 0×0000000000000000 in ?? ()

(gdb) c / / 继续执行,触发下一个断点。
Continuing.
Breakpoint 2, main.main () at main.go:17
17! ! println(test(s, i))

(gdb) info goroutines // 当前 goroutine 序号为 1。
* 1 running runtime.gosched
2 runnable runtime.gosched

(gdb) goroutine 1 bt // 当前 goroutine 调用堆栈。
#0 0x000000000000f6c0 in runtime.gosched () at pkg/runtime/proc.c:927
#1 0x000000000000e44c in runtime.main () at pkg/runtime/proc.c:244
#2 0x000000000000e4ef in schedunlock () at pkg/runtime/proc.c:267
#3 0×0000000000000000 in ?? ()

(gdb) bt // 查看当前调⽤堆栈,可以与当前 goroutine 调用堆栈对比。
#0 main.main () at main.go:17
#1 0x000000000000e44c in runtime.main () at pkg/runtime/proc.c:244
#2 0x000000000000e4ef in schedunlock () at pkg/runtime/proc.c:267
#3 0×0000000000000000 in ?? ()

(gdb) info frame // 堆栈帧信息。
Stack level 0, frame at 0x442139f88:
rip = 0×2167 in main.main (main.go:17); saved rip 0xe44c
called by frame at 0x442139fb8
source language go.
Arglist at 0x442139f28, args:
Locals at 0x442139f28, Previous frame’s sp is 0x442139f88
Saved registers:
rip at 0x442139f80

(gdb) info locals // 查看局部变量。
i = 1234
s = “haha”

(gdb) p s // 以 Pretty-Print 方式查看变量。
$1 = “haha”

(gdb) p $len(s) // 获取对象长度($cap)
$2 = 4

(gdb) whatis i // 查看对象类型。
type = int

(gdb) c // 继续执行,触发 breakpoint() 断点。
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
runtime.breakpoint () at pkg/runtime/asm_amd64.s:81
81 RET

(gdb) n // 从 breakpoint() 中出来,执行源码下一行代码。
main.test (s=”haha”, x=1234, r=”test: haha 1234″) at main.go:11
11 return r

(gdb) info args // 从参数信息中,我们可以看到命名返回参数的值。
s = “haha”
x = 1234
r = “test: haha 1234″

(gdb) x/3xw &r // 查看 r 内存数据。(指针 8 + 长度 4)
0x442139f48: 0×42121240 0×00000000 0x0000000f
(gdb) x/15xb 0×42121240 // 查看字符串字节数组
0×42121240: 0×74 0×65 0×73 0×74 0x3a 0×20 0×68 0×61
0×42121248: 0×68 0×61 0×20 0×31 0×32 0×33 0×34

(gdb) c // 继续执行,进程结束。

Continuing.
test: haha 1234
[Inferior 1 (process 4088) exited normally]

(gdb) q // 退出 GDB。

Go语言debug调试相关推荐

  1. C语言学习笔记—code:blocks工具debug调试异常

    C语言学习笔记-code:blocks工具debug调试异常 参考文章: (1)C语言学习笔记-code:blocks工具debug调试异常 (2)https://www.cnblogs.com/do ...

  2. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  3. stm32 MDK debug调试方法

    MDK debug调试方法 使用仿真器进行在线调试 ⭐基础调试方法 调试环境的配置 调试界面介绍 执行操纵栏 断点 挂起 调试窗口介绍 call stack windows watch windows ...

  4. 【Java学习整理】2021最新版 Eclipse下载+安装+页面介绍+常见问题解答+查看源码+常用快捷键+Debug调试(详细)

    学习 Java 语言程序设计必须选择一个功能强大.使用简单,能够辅助程序设计的 IDE. Eclipse 是目前最流行的 Java 语言开发工具,它强大的代码辅助功能,可以帮助开发人员自动完成语法修正 ...

  5. C语言之调试技巧(VS2019编译器)

    C语言之调试技巧(VS2019编译器) 一.什么是调试?调试的作用 1.1 什么是调试 1.2 调试的基本步骤 1.3 Debug版本和Release版本的介绍 二.Windows环境调试的准备 2. ...

  6. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)...

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  7. C语言入门调试与思维

    C语言入门调试与思维 刚开始我作为一个C语言编译小白,对程序的书写和运行难以上手,初始阶段期间看了很多程序员路上的感想,也对程序这个行业有大致的了解,感到很新颖,很适合我的一个基础语言系,我用一学期来 ...

  8. 在c语言中调试作用是什么意思,c语言程序调试方法整理

    c语言程序的调试方法 所谓程序调试是指对程序的查错和排错. 调试程序一般应经过以下几个步骤: 一.先进行人工检查,即静态检查. 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查.这一步十分 ...

  9. 恕我直言,IDEA 的 Debug 调试,你可能只用了 10%

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:bojiangzhou cnblogs.com/chiang ...

最新文章

  1. 如此精心整理的深度学习资源只在这里,值得你拥有!(上篇)
  2. pytorch gans
  3. BeanUtils的方法
  4. c++使用cin输入数据
  5. OWASP出品:Xenotix XSS漏洞测试框架及简单使用
  6. spring中使用注解代替xml配置
  7. 国开计算机应用基础中考答案,国开计算机应用基础模块4PowerPoint2010电子演示文稿系统答案...
  8. PPT下载下来是php,用php下载jpg,doc,ppt文件已损坏
  9. bp神经网络测试_BP 神经网络驱动的手写体数字识别软件 EasyOCR
  10. hdu 3507 Print Article(dp+斜率优化)
  11. Spark用DSL表达式如何使用row_number函数
  12. CCNP之IPv6技术-过渡技术(NAT-PT)
  13. chorme 下载文件 保留 放弃_怎样避免Chrome扫描下载文件
  14. 如何重装来客电商源码?
  15. 计算机网络施工组织设计,06网络系统施工组织设计方案.doc
  16. .net mysql 博客_asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
  17. coreldraw快速撤回_CorelDRAW基础教程,教你CDR X8撤销、重做与重复操作方法
  18. 小数除法竖式计算过程
  19. 苟富贵倒萨忽然他确实
  20. matlab绘制布尔运算图,干货丨最全的布尔运算制作小图标教程!

热门文章

  1. taobao.item.update.listing( 一口价商品上架 )
  2. 安徽大学计算机学院张兴义教授,“2018年CCF合肥为新研究生导航” 开启复合型人才培养之路...
  3. 2021年兴义五中高考成绩查询,贵州省黔西南州兴义市第五中学2021年招生计划
  4. 虚幻4渲染编程(环境模拟篇)【第五卷:可交互物理植被模拟 - 上】
  5. 编程之余对人品的感悟
  6. 一起Talk Android吧(第五百零七回:图片滤镜ImageFilterView)
  7. opencv与PIL互转
  8. 2015 ACM Arabella Collegiate Programming Contest
  9. 连接到服务器 ------------------------------ 无法连接到 + SQL Server 请求失败或服务未及时响应....解决思路
  10. OpenCV C++开发 第一节:Win7开发环境搭建