第一关,我们在 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