zoukankan      html  css  js  c++  java
  • gdb常用命令

    1. 查看文件中某变量的值:
    file::variable
    function::variable
    可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
    gdb) p 'f2.c'::x

    查看数组的值
    有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
    int *array = (int *) malloc (len * sizeof (int));
    于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
    p *array@len

    如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。


    2.输出格式
    一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
    (gdb) p i
    $21 = 101
    (gdb) p/a i
    $22 = 0x65
    (gdb) p/c i
    $23 = 101 'e'
    (gdb) p/f i
    $24 = 1.41531145e-43
    (gdb) p/x i
    $25 = 0x65
    (gdb) p/t i
    $26 = 1100101

    3.查看内存
    使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
    x/
    n、f、u是可选的参数。
    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

    n/f/u三个参数可以一起使用。例如:
    命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。


    4. 查看堆栈: bt full


    5.  查看信息:info
    info break 查看断点信息
        info locals 打印出当前函数中所有局部变量及其值
    info stack 查看栈中信息
        info frame 更详细的栈层地址信息
    info args 查看参数信息
    info registers/info all-registers 查看(所有)寄存器信息
    info sources 查看项目的源代码信息


    6. 多线程调试

    多线程调试可能是问得最多的。其实,重要就是下面几个命令:

    • info thread 查看当前进程的线程。
    • thread <ID> 切换调试的线程为指定ID的线程。
    • break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。
    • set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
      • off 不锁定任何线程,也就是所有线程都执行,这是默认值。
      • on 只有当前被调试程序会执行。
      • step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

    7、调试宏

    这个问题超多。在GDB下,我们无法print宏定义,因为宏是预编译的。但是我们还是有办法来调试宏,这个需要GCC的配合。

    在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。

    另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

    • info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
    • macro – 你可以查看宏展开的样子。

    8、源文件

    这个问题问的也是很多的,太多的朋友都说找不到源文件。在这里我想提醒大家做下面的检查:

    1. 编译程序员是否加上了-g参数以包含debug信息。
    2. 路径是否设置正确了。使用GDB的directory命令来设置源文件的目录。

    下面给一个调试/bin/ls的示例(ubuntu下)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ apt-get source coreutils
    $ sudo apt-get install coreutils-dbgsym
    $ gdb /bin/ls
    GNU gdb (GDB) 7.1-ubuntu
    (gdb) list main
    1192    ls .c: No such file or directory.
    in ls .c
    (gdb) directory ~ /src/coreutils-7 .4 /src/
    Source directories searched: /home/hchen/src/coreutils-7 .4:$cdir:$cwd
    (gdb) list main
    1192        }
    1193    }
    1194
    1195    int
    1196    main (int argc, char **argv)
    1197    {
    1198      int i;
    1199      struct pending *thispend;
    1200      int n_files;
    1201

    9、条件断点

    条件断点是语法是:break  [where] if [condition],这种断点真是非常管用。尤其是在一个循环或递归中,或是要监视某个变量。注意,这个设置是在GDB中的,只不过每经过那个断点时GDB会帮你检查一下条件是否满足。

    10、命令行参数

    有时候,我们需要调试的程序需要有命令行参数,很多朋友都不知道怎么设置调试的程序的命令行参数。其实,有两种方法:

    1. gdb命令行的 –args 参数
    2. gdb环境中 set args命令。

    11、gdb的变量

    有时候,在调试程序时,我们不单单只是查看运行时的变量,我们还可以直接设置程序中的变量,以模拟一些很难在测试中出现的情况,比较一些出错,或是switch的分支语句。使用set命令可以修改程序中的变量。

    另外,你知道gdb中也可以有变量吗?就像shell一样,gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:

    1
    2
    3
    4
    5
    (gdb) set $i = 0
     
    (gdb) p a[$i++]
     
    ...   #然后就一路回车下去了

    当然,这里只是给一个示例,表示程序的变量和gdb的变量是可以交互的。

    12、x命令

    也许,你很喜欢用p命令。所以,当你不知道变量名的时候,你可能会手足无措,因为p命令总是需要一个变量名的。x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。

    • x/x 以十六进制输出
    • x/d 以十进制输出
    • x/c 以单字符输出
    • x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
    • x/s 以字符串输出

    13、command命令

    有一些朋友问我如何自动化调试。这里向大家介绍command命令,简单的理解一下,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。下面是一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (gdb) break func
    Breakpoint 1 at 0x3475678: file test .c, line 12.
    (gdb) command 1
    Type commands for when breakpoint 1 is hit, one per line.
    End with a line saying just "end" .
    >print arg1
    >print arg2
    >print arg3
    >end
    (gdb)

    当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。


    14. (gdb) help disassemble 
    Disassemble a specified section of memory.
    Default is the function surrounding the pc of the selected frame.
    With a /m modifier, source lines are included (if available).        支持的版本可以打出每行源代码和汇编对应关系
    With a /r modifier, raw instructions in hex are included.
    With a single argument, the function surrounding that address is dumped.
    Two arguments (separated by a comma) are taken as a range of memory to dump,
      in the form of "start,end", or "start,+length".


  • 相关阅读:
    uml系列(四)——类图
    Linux设备驱动实现自己主动创建设备节点
    收集了三年的最好的设计站点
    CoInitialize浅析一
    iOS 单例
    Android开发之异步具体解释(二)之AsyncTask
    ComboBox控件
    下拉框Html.DropDownList 和DropDownListFor 的经常用法
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can&#39;t be established. 的问题
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3327675.html
Copyright © 2011-2022 走看看