zoukankan      html  css  js  c++  java
  • gdb,程序调试助手

    启动GDB:(其中我的app是编译之后的可执行文件)

    退出命令:quit或者简写q

    帮助获取:

    gdb通过完备的在线帮助,使我们使用起来更加方便.所有的帮助信息都是通过help命令获得的,运行help命令时,如果不指定参数,gdb将输出分类信息:

    可以通过分类名作为help指定的参数来获得帮助,以断点(breakpoint)为例:

    在gdb调试中,有几个注意点可以提高调试效率,第一,如果输入的命令开头字母能唯一标识这个命令,则后面的命令可以不用输入,例如退出命令quit,只输入q就已经是唯一标识的命令了,其他命令没有q开头的,故,我们可以直接输入q,然后回车就可以达到输入quit的作用,第二,gdb中也可以师徒TAB补全指令,第三,对于大多数的命令都可以 以直接按回车(Enter)的方式运行前面执行过的命令.

    现在我们调试一个简单的程序,运用断点:

     1 #include<stdio.h>
     2 int main(void)
     3 {
     4     for(int i=0;i<10;i++)
     5     {
     6         printf("i=%d
    ",i);
     7         printf("GDB test
    ");
     8     }
     9     return 0;
    10

    这里需要解释几个命令:

    设置断点,break命令;

    我们把断点设置在main函数的第4行:

    main.c:4表示main函数的第四行,这样写是有意义的而且是推荐的做法,在多文件中操作时更清晰.

    断点(BreakPoint)

    • 设置断点:(threadno 指定了线程的 ID,注意,这个 ID 是 gdb 分配的,可以通过 "info threads" 命令来查看正在运行程序中的线程信息)
      • break thread <threadno> -- break命令没有参数时,表示在下一条指令处停住.
      • break +offset thread <threadno> -- 在当前行号的后面的 offset 行停住.(offiset 为自然数)
      • break -offset thread <threadno> -- 在当前行号的前面的 offset 行停住.(offiset 为自然数)
      • break <linenum> thread <threadno> -- 在指定行号停住.
      • break filename:linenum thread <threadno> -- 在源文件filename的linenum行处停住.
      • break <function> thread <threadno> -- 在进入指定函数时停住.
      • break filename:function thread <threadno> --在源文件filename的function函数的入口处停住.
      • break *address -- 在程序运行的内存地址处停住.
      • break ... thread <threadno> if <condition> -- ...可以是上述的参数,condition表示条件,在条件成立时停住.比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序.
      • tbreak -- 设置只停止一次的断点.用法和 break 类似
    • 查看断点
      • info breakpoints [n]
      • info break [n]

    观察点(WatchPoint) -- 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序.

    • 设在观察点
      • watch <expr> -- 为表达式(变量)expr设置一个观察点.一量表达式值有变化时,马上停住程序.
      • rwatch <expr> -- 当表达式(变量)expr被读时,停住程序.
      • awatch <expr> -- 当表达式(变量)的值被读或被写时,停住程序.
    • 查看观察点
      • info watchpoints -- 列出当前所设置了的所有观察点

    这样,我们使用最基本的调试方法,实现断点和查看变量的值,其中next命令(简写n)是单挑语句执行,下一步的的意思.

    维护停止点

      • 清除停止点

    clear -- 所有的已定义的停止点.

    clear <function> -- 清除所有设置在函数上的停止点.

    clear <filename:function> -- 清除所有设置在函数上的停止点.

    clear <linenum> -- 清除所有设置在指定行上的停止点.

    clear <filename:linenum> -- 清除所有设置在指定行上的停止点.

      • 删除停止点

    delete [range] -- 删除停止点.其简写命令为 d.

      • 禁用停止点

    disable [range] -- 禁用停止点

      • 启用停止点

    enable [range] -- 启用停止点.

    enable once [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动 disable.

    enable count [rang] -- 启用停止点 count 次,当程序停止后,该停止点马上被 gdb 自动 disable.

    enable delete [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动删除.

      • 停止条件维护 -- 以用 condition 命令来修改断点的条件.(只有break和watch命令支持if,catch目前暂不支持if)

    condition <bnum> <expression> -- 修改断点号为bnum的停止条件为expression.

    condition <bnum> -- 清除断点号为bnum的停止条件.

      • 忽略停止点 N 次

    ignore <bnum> <count> -- 表示忽略断点号为 bnum 的停止条件 count 次.

      • 为停止点设定运行命令
        • 格式:
          commands [bnum]
                 ... command-list ...
                 // 为断点号 bnumi写一个命令列表.当程序被该断点停住时,gdb 依次运行命令列表中的命令.
          end
        • 例如:
          break foo if x>0
            commands
                 printf "x is %d/n",x
                 continue
          end

    恢复执行

      continue [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c

      fg [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c

    单步调试

      step <count> -- 单步跟踪,如果有函数调用,它会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1.

      next <count> -- 同样单步跟踪,如果有函数调用,他不会进入该函数.count 表示执行后面 count 条语句,不加则默认为 1

    查看运行时数据

    • print /<f> <expr> -- 查看当前程序的运行数据.简写 p.printf "fmt",arg,... -- 打印格式化字符灿 fmt.
      • <expr> 是表达式
        • @ -- 是一个和数组有关的操作符,在后面会有更详细的说明.在 @ 左边是数组的地址,右边是数组的长度,eg: array@len
        • :: -- 指定一个在文件或是一个函数中的变量.
        • {<type>} <addr> --表示一个指向内存地址<addr>的类型为type的一个对象.
      • <f>是输出的格式
        • d -- 按十进制格式显示变量.
        • u -- 按十六进制格式显示无符号整型.
        • o -- 按八进制格式显示变量.
        • t -- 按二进制格式显示变量.
        • a -- 按十六进制格式显示变量.
        • c -- 按字符格式显示变量.
        • f -- 按浮点数格式显示变量.
    • 注意:
        • 1.若出现变量重名,局部变量会隐藏全局变量.若想查看全局变量的值时,可以使用“::”操作符.
        • 2.可以通过这种形式指定你所想查看的变量 eg:
              *'filename'::variable
              *function::variable
    • printf "fmt",arg,... -- 打印格式化字符灿 fmt.

    查看内存

      • examine/<n/f/u> <addr> -- 来查看内存地址中的值.简写 x
        • <n/f/u><addr> 表示一个内存地址.
          • n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容.
          • f 表示显示的格式
            • s -- 按字符串格式显示内存地址内容.
            • i -- 查看内存地址的机器指令内容
            • x -- 按十六进制格式显示地址内容.
            • d -- 按十进制格式显示地址内容.
            • u -- 按十六进制格式显示无符号整型.
            • o -- 按八进制格式显示地址内容.
            • t -- 按二进制格式显示地址内容.
            • a -- 按十六进制格式显示地址内容.
            • c -- 按字符格式显示地址内容.
            • f -- 按浮点数格式显示地址内容.
          • u 表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是 4 个 bytes.
            • b -- 表示单字节
            • h -- 表示双字节
            • w -- 表示四字节
            • g -- 表示八字节
        • <addr> 表示一个内存地址.

    更多请参考:http://www.cnblogs.com/kzloser/archive/2012/09/21/2697185.html

     默认的list只是列出了10行,采用show listsize可以查看当前的显示代码行数,用set listsize count设置list命令显示的源代码数量最多为count行,0表示不限制行数。

    step单步的时候,会进入函数,next单步的时候,不会进入函数.

    单步调试的时候,显示在最前面的那个数字,代表的是这句话在源文件中的行号.

  • 相关阅读:
    Linux 之 文件压缩解压
    Linux 之 文件搜索命令
    Linux 之 文件内容查看
    Linux 之 Vim常用命令
    Linux 之 CentOS练习
    CentOS找不到想要的镜像版本?
    Swoole 简单学习(2)
    Swoole 简单学习
    svn的简单知识
    8、16、32-BIT系列单片机区别与特点
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7220596.html
Copyright © 2011-2022 走看看