您的位置:首页 > 其它

gdb基本使用方法及常用命令

2016-10-14 10:23 483 查看
示例代码
plain copy

gdbtest.c  

-----------------------  

#include <stdio.h>  

#include "gdbinc.h"  

  

int main(int argc, char* argv[]) {  

        int a = 0;  

        printf("%d/n", a);  

        a = 10;  

        int b = compute(a);  

        printf("%d/n", b);  

        printf("%d/n", max(13, 23));  

        if (argc > 1) {  

                printf("%s/n", argv[1]);  

        }  

}  

  

int compute(int a) {  

        int sum = 0;  

        int i;  

        for (i = 1; i <= a; i++) {  

                sum += i;  

        }  

        return sum;  

}  

  

gdbinc.h  

-----------------------------  

int max(int a, int b) {  

        return a > b ? a : b;  

}  

一、编译、链接成可执行文件

记得加入-g选项

gcc -g gdbtest.c -o test

 

二、启动gdb

gdb filename   ---- 本例中是gdb test,如下图:

 


 或者

 gdb

 (gdb)file filename,如下图:



 

三、退出

(gdb)quit

 

 四、基本操作

 (1)列出源代码list,在提示符下打入list,会出现一部分源代码,接着按回车会重复上一次命令



可以利用help list查询list的使用方法



a.list 10  -- 以第10行为中心显示



b.显示compute函数 list compute



c.列出10-15行的源代码 list 10,15



d.列出其他文件的相应行或函数

list gdbinc.h:1

list gdbinc.h:max

 

(2)运行程序run



如果需要参数可以在run后面跟上参数



 

(3)设置断点break

a.在某行设置断点 break 7



b.在某函数设置断点 break compute

c.在其他文件设置断点(行或函数名) break gdbinc.h:2   break gdbinc.h:max

d.在某个地址设置断点  break *address  (当你调试的程序没有源程序时使用)

e.查询断点信息info break



f.条件断点 break <linenum>or<func> if condition

如:break 8 if a == 10

g.开启和关闭断点

   disable 断点号 (关闭)

   enable 断点号  (开启)

   enable once 断点号 (开启一次)

   enable delete 断点号(开启一次后删除)

h.删除断点

   delete 断点号

   clear  清除当前行的断点

i.继续执行continue,当执行到某处中断时,使其继续执行



 

(4)单步执行不进入函数next

(5)单步执行进入函数step

(6)终止正在调试的程序kill



(7)监视值变动watch expression(当你运行run后,你想知道哪些值在运行中被改变了,可以设置此)


(8)监视值被读rwatch expression(基本同上)

(9)在运行时打印变量的值print expression

     print/F expression,其中F为格式(x--16进制,d--有符号十进制,u--无符号十进制,f--浮点格式)

(10)修改变量值set variable=value

(11)执行shell命令[shell 命令名]

(12)不退出gdb产生可执行文件[make,必须有Makefile文件]

(13)info命令(此命令用处广泛)

a.info break查看断点信息(见上面断点)

b.info args查看当前方法的参数



c.info stack查看调用堆栈



d.info source查看当前源文件的信息



e.info sources查看所有在程序中的源文件路径

(14)查看内存命令 x/<n/f/u> <addr>   n、f、u是可选的参数。<addr>表示一个内存地址。

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

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

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

输出格式

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

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

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

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

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

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

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

c 按字符格式显示变量。

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



比如:上图中 x/4dw 0xbffff650  指的是显示4个单元的内容,以10进制显示,每个单元长度为4个字节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: