@@ -17,8 +17,119 @@ GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。使
17
17
2 . 传递-gcflags "-N -l" 参数,这样可以忽略Go内部做的一些优化,聚合变量和函数等优化,这样对于GDB调试来说非常困难,所以在编译的时候加入者两个参数避免这些优化。
18
18
19
19
## 常用命令
20
+ GDB的一些常用命令如下所示
20
21
22
+ - list
23
+
24
+ 简写命令`l`,用来显示源代码,默认显示十行代码,后面可以带上参数显示的具体行,例如:`list 15`,显示十行代码,其中15行在显示的十行里面的中间,如下所示。
25
+
26
+ 10 time.Sleep(2 * time.Second)
27
+ 11 c <- i
28
+ 12 }
29
+ 13 close(c)
30
+ 14 }
31
+ 15
32
+ 16 func main() {
33
+ 17 msg := "Starting main"
34
+ 18 fmt.Println(msg)
35
+ 19 bus := make(chan int)
36
+
37
+
38
+ - break
39
+
40
+ 简写命令`b`,用来设置断点,后面跟上参数设置断点的行数,例如`b 10`在第十行设置断点。
41
+ - delete
42
+
43
+ 简写命令` d ` ,用来删除断点,后面跟上断点设置的序号,这个序号可以通过` info breakpoints ` 获取相应的设置的断点序号,如下是显示的设置断点序号。
44
+
45
+ Num Type Disp Enb Address What
46
+ 2 breakpoint keep y 0x0000000000400dc3 in main.main at /home/xiemengjun/gdb.go:23
47
+ breakpoint already hit 1 time
48
+
49
+ - backtrace
50
+
51
+ 简写命令`bt`,用来打印执行的代码过程,如下所示:
52
+
53
+ #0 main.main () at /home/xiemengjun/gdb.go:23
54
+ #1 0x000000000040d61e in runtime.main () at /home/xiemengjun/go/src/pkg/runtime/proc.c:244
55
+ #2 0x000000000040d6c1 in schedunlock () at /home/xiemengjun/go/src/pkg/runtime/proc.c:267
56
+ #3 0x0000000000000000 in ?? ()
57
+ - info
58
+
59
+ info命令用来显示信息,后面有几种参数,我们常用的有如下几种:
60
+
61
+ - `info locals`
62
+
63
+ 显示当前执行的程序中的变量值
64
+ - `info breakpoints`
65
+
66
+ 显示当前设置的断点列表
67
+ - `info goroutines`
68
+
69
+ 显示当前执行的goroutine列表,如下代码所示,带*的表示当前执行的
70
+
71
+ * 1 running runtime.gosched
72
+ * 2 syscall runtime.entersyscall
73
+ 3 waiting runtime.gosched
74
+ 4 runnable runtime.gosched
75
+ - print
76
+
77
+ 简写命令`p`,用来打印变量或者其他信息,后面跟上需要打印的变量名,当然还有一些很有用的函数$len()和$cap(),用来返回当前string、slices或者maps的长度和容量。
78
+
79
+ - whatis
80
+
81
+ 用来显示当前变量的类型,后面跟上变量名,例如`whatis msg`,显示如下:
82
+
83
+ type = struct string
84
+ - next
85
+
86
+ 简写命令`n`,用来单步调试,跳到下一步,当有断点之后,可以输入`n`跳转到下一步继续执行
87
+ - countinue
88
+
89
+ 简称命令`c`,用来跳出当前断点处,后面可以跟参数N,跳过多少次断点
90
+
91
+ - set variable
92
+
93
+ 该命令用来改变运行过程中的变量值,格式如:`set variable <var>=<value>`
21
94
## 调试过程
95
+ 我们通过下面这个代码来演示如何通过GDB来调试Go程序,下面是将要演示的代码:
96
+
97
+ //文件名gdbfile.go
98
+ package main
99
+
100
+ import (
101
+ "fmt"
102
+ "time"
103
+ )
104
+
105
+ func counting(c chan<- int) {
106
+ for i := 0; i < 10; i++ {
107
+ time.Sleep(2 * time.Second)
108
+ c <- i
109
+ }
110
+ close(c)
111
+ }
112
+
113
+ func main() {
114
+ msg := "Starting main"
115
+ fmt.Println(msg)
116
+ bus := make(chan int)
117
+ msg = "starting a gofunc"
118
+ go counting(bus)
119
+ for count := range bus {
120
+ fmt.Println("count:", count)
121
+ }
122
+ }
123
+
124
+ 编译文件,生成可执行文件gdbfile:
125
+
126
+ go build -gcflags "-N -l" -ldflags "-s" gdbfile.go
127
+
128
+ 通过gdb命令启动调试:
129
+
130
+ gdb gdbfile
131
+
132
+
22
133
23
134
## links
24
135
* [ 目录] ( < preface.md > )
0 commit comments