Skip to content

Commit b526750

Browse files
committed
GDB调试
1 parent d714f4f commit b526750

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

11.2.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,119 @@ GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。使
1717
2. 传递-gcflags "-N -l" 参数,这样可以忽略Go内部做的一些优化,聚合变量和函数等优化,这样对于GDB调试来说非常困难,所以在编译的时候加入者两个参数避免这些优化。
1818

1919
## 常用命令
20+
GDB的一些常用命令如下所示
2021

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>`
2194
## 调试过程
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+
22133

23134
## links
24135
* [目录](<preface.md>)

0 commit comments

Comments
 (0)