IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    golang gdb调试教程

    mckee发表于 2016-01-17 15:35:49
    love 0

    gdb允许你调试已经编译好的二进制文件, 它提供了一个交互终端,使你无需修改源代码,来调试程序.
    gdb基础命令:

    命令
    解释
    简写
    file
    装入想要调试的可执行文件
    无
    list
    列出产生执行文件源代码的一部分
    l
    next
    执行一行源代码但不进入函数内部
    n
    step
    执行一行源代码而且进入函数内部
    s
    run
    执行当前被调试的程序
    r
    continue
    继续执行程序
    c
    quit
    终止GDB
    q
    print
    输出当前指定变量的值
    p
    btrak
    在代码里设置断点
    b
    info break
    查看设置断点的信息
    i b
    delete
    删除设置的断点
    d
    watch
    监视一个变量的值,一旦值有变化,程序停住
    wa
    help
    GDB中的帮助命令
    h

    默认的编译会给调试带来困难,请带上指定参数go build -gcflags "-N -l"
    go build -gcflags "-N -l" test.go

    进入gdb
    gdb test

    查看源码
    (gdb) l test.go:10            //列出指定的文件与行号,默认10行

    设置断点, delete命令可用来删除断点:
    (gdb) b 20
    Breakpoint 1 at 0x401388: file /home/mckee/program/go/src/test/test.go, line 20.
    (gdb) b 24
    Breakpoint 2 at 0x401501: file /home/mckee/program/go/src/test/test.go, line 24.
    (gdb) info breakpoints
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x0000000000401388 in main.main at /home/mckee/program/go/src/test/test.go:20
    2       breakpoint     keep y   0x0000000000401501 in main.main at /home/mckee/program/go/src/test/test.go:24

    执行,显示本地变量、实参与返回值的栈帧上的名字、类型与位置
    (gdb) r
    Starting program: /home/mckee/program/go/src/test/test 
    2
    
    Breakpoint 1, main.main () at /home/mckee/program/go/src/test/test.go:20
    20		fmt.Println(sl)
    (gdb) info locals
    i = 2
    i = 0
    ch = 0xc82000a300
    sl = {array = 0xc820012200, len = 5, cap = 8}
    chs = {array = 0x0, len = 4254562, cap = 16}
    (gdb) info args
    No arguments.
    (gdb) p i
    $1 = 2
    (gdb) whatis sl
    type = struct []int

    调试过程(调试信息过长,就不贴了)
    (gdb) next(简写n)         //下一步
    (gdb) step(简写s)         //单步执行,例如跳进函数内部
    (gdb) finish             //退出该函数返回到它的调用函数中
    (gdb) until(简写u)        //直接执行到下一行,如果遇到循环语句,会执行完当前循环
    (gdb) u Num              //指哪打哪,继续执行直到Num行时触发断点
    (gdb) continue(简写c)     //从断点开始继续执行

    golang通过gdb的扩展机制,来扩展了一些有用的命令,这将会给调试带来帮助
    (gdb) p var //美观打印出一个字符串、切片、映射、信道或接口
    (gdb) p $len(var)    //用于字符串、切片与映射的 $len() 与 $cap() 函数
    //函数将接口抛至其动态类型
    (gdb) p $dtype(var)  
    (gdb) iface var
    //检查goroutines
    (gdb) info goroutines
    (gdb) goroutine n cmd
    (gdb) help goroutine



沪ICP备19023445号-2号
友情链接