第一关,我们在 for 循环里面设置一个断点(b)来查看执行每次循环时我们的代码会各有什么状态。我们可以使用print(p)命令来检查当前内容的一个变量,还有 list(l)和 backtrace(bt)命令查看当前步骤周围的代码。程序运行时可以使用 next(n)执行下一步或者使用 breakpoint(c)执行到下一个断点。
(gdb) b main.go:9 Breakpoint 1 at 0x400d35: file/home/bfosberry/workspace/gdb_sandbox/main.go, line 9. (gdb) run Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandboxBreakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9 9 fmt.Println("looping") (gdb) l 4 "fmt"5 ) 6 7 func main() {8 fori := 0; i < 5; i++ { 9 fmt.Println("looping") 10 }` 11 fmt.Println("Done") 12 } (gdb) p i $1 = 0 (gdb) n looping Breakpoint 1, main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9 9 fmt.Println("looping") (gdb) p i $2 = 1 (gdb) bt# 0 main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:9
我们的断点可以设置在关联文件的行号中、GOPATH里的文件的行号或一个包里的函数。如下也是一个有效的断点:
(gdb) b github.com/bfosberry/gdb_sandbox/main.go:9(gdb) b 'main.main'
Structs
我们可以用稍微复杂一点的代码来实例演示如何调试。我们将使用f函数生成一个简单的pair,x和y,当x相等时y=f(x),否则=x。
type pair struct{ x int y int}func handleNumber(i int) *pair { val := i ifi%2 == 0 { val = f(i) } return&pair{ x: i, y: val, } }func f(intx) int{ returnx*x + x }
也可以在循环中改变代码来访问这些新函数。
p := handleNumber(i) fmt.Printf("%+v\n", p) fmt.Println("looping")
因为我们需要调试的是变量 y。我们可以在y被设置的地方放置断点然后单步执行。可以使用 info args 查看函数的参数,在 bt 之前可以返回当前回溯。
(gdb) b 'main.f'(gdb) run Starting program: /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/gdb_sandboxBreakpoint 1, main.f (x=0, ~anon1=833492132160) at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33 33 returnx*x + x (gdb) info args x = 0 (gdb) continueBreakpoint 1, main.f (x=0, ~anon1=833492132160) at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33 33 returnx*x + x (gdb) info args x = 2 (gdb) bt#0 main.f (x=2, ~anon1=1) at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:33#1 0x0000000000400f0e in main.handleNumber (i=2, ~anon1=0x1) at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:24#2 0x0000000000400c47 in main.main () at /home/bfosberry/.go/src/github.com/bfosberry/gdb_sandbox/main.go:14