美文网首页
gdb调试技巧一

gdb调试技巧一

作者: 循环不计次 | 来源:发表于2019-05-23 22:27 被阅读0次

    1.编译时加上一个-g

    默认编译生成的可执行文件是无法使用 gdb 来跟踪或调试的,因为可执行程序中没有可供 gdb 调试使用的特殊信息,为了将必要的调试信息整合到可执行文件中,我们便需要用到 -g 选项,这样生成的可执行程序,倘若出现问题,便可以使用 gdb 找出问题具体出现的位置,便于问题的解决。


    2.开始调试

    gdb xxx(可执行程序)


    3.查看源码

    在gdb中输入l,不能完全显示,多次l


    4.下断点

    方式1、根据函数名,查找符号(symbol)设置断点 

    例子:b func_name

    方式2、根据代码行位置设置断点 

    例子:b /src/codefile.cc:81

    方式3、根据运行时的地址设置断点 

    例子1:b *0x5859c0。"*"号是必须加在地址前的,0x5859c0为函数指针的地址


    5.查看变量的值

    在gdb中p或者print

    (1).程序变量
    在GDB中,你可以随时查看以下三种变量的值:

    1、全局变量(所有文件可见的)

    2、静态全局变量(当前文件可见的)

    3、局部变量(当前Scope可见的)

    如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量的值。如果此时你想查看全局变量的值时,你可以使用“::”操作符:

    file::variable

    function::variable

    可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。

    (2).查看数组

    有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

    int *array = (int *) malloc (len * sizeof (int));

    于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:

    *array@len 

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

    (3).输出格式

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

    x 按十六进制格式显示变量。

    d 按十进制格式显示变量。

    u 按十六进制格式显示无符号整型。

    o 按八进制格式显示变量。

    t 按二进制格式显示变量。

    a 按十六进制格式显示变量。

    c 按字符格式显示变量。

    f 按浮点数格式显示变量。

    (4).查看内存

    你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

    x/

    n、f、u是可选的参数。

    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

    表示一个内存地址。

    相关文章

      网友评论

          本文标题:gdb调试技巧一

          本文链接:https://www.haomeiwen.com/subject/fkpizqtx.html