新手入门gdb调试

gdb的开启与启动

在使用gcc编译时,需要在命令的最后加上-g这个参数,就表示生成的程序可以利用gdb调试。使用gdb app来启动目标程序,app可换成目标程序名。另外使用set args来传参:

$ gdb app
(gdb) set args 参数1 参数2
(gdb) r  #用来运行程序,当然得先设置断点,否则程序就直接执行结束了

设置参数还可以:

$ gdb --args app 参数1 参数2

调试过程查看源文件

(1)查看当前文件
直接输入l或者l加行号或者l加函数名。如:

l 10  #查看第10行
l main #查看main函数

(2)查看非当前文件
l加文件名,如:

l test.c  #查看test文件
l test.c:10 #查看test文件第10行
l test.c:swap #查看swap函数

断点操作

(1)设置断点
使用的b加行号,函数名等。如:

b 55  #当前文件第55行设置断点
b getResult #getResult函数设置断点
b test.c:11 #非当前文件设置断点
b test.c:swap 

(2)查看断点

i b

(3)删除断点

d 3  #删除3号断点
d 1 4 #删除1和4号断点
d 6-10 #删除6-10号断点
d      #删除所有断点

(4)设置断点无效/生效
dis/ena,使用方法类似于d,如:

dis 1-3 #使得1-3号断点失效
ena 2  #使2号断点生效

(5)设置条件断点

b 11 if i==1  #当变量i=1时,此断点才会停止

调试相关命令

(1)打印变量值

p i  #打印i这个变量得值
p *p #打印指针指向的值
p *p@2 #打印指针偏移2后,指向的值
p p[2] #同上
p/x p[0] #16进制打印
p/c p[0] #按字符打印
p/f p[0] #按浮点打印
p/t p[0] #按二进制打印

(2)打印变量的类型

ptype i #打印变量i的类型

(3)向下调试

n       #next, 向下运行一步,不会进入函数体
s       #step, 向下运行一步,会进入函数体,使用finish后退出函数体
c       #continue, 向下运行多步直到下一个断点位置
until   #从循环体直接跳出

调试的简单例子

$ gcc main.c -o app -g
$ gdb app
(gdb) l swap
1	#include <stdlib.h>
2	
3	void swap(int* a, int* b) {
4	    *a = *a + *b;
5	    *b = *a - *b;
6	    *a = *a - *b;
7	}
8	
9	int main() {
10	    int a[6] = {1, 2, 3, 4, 5, 6};
(gdb) b 10
Breakpoint 1 at 0x4004f5: file main.c, line 10.
(gdb) b 11
Breakpoint 2 at 0x40051f: file main.c, line 11.
(gdb) b 12
Breakpoint 3 at 0x40052d: file main.c, line 12.
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004f5 in main at main.c:10
2       breakpoint     keep y   0x000000000040051f in main at main.c:11
3       breakpoint     keep y   0x000000000040052d in main at main.c:12
(gdb) d 2
(gdb) r
Starting program: /home/app 

Breakpoint 1, main () at main.c:10
10	    int a[6] = {1, 2, 3, 4, 5, 6};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64
(gdb) ptype a
type = int [6]
(gdb) p i
$1 = 0
(gdb) p a
$2 = {4195712, 0, 4195280, 0, -8464, 32767}
(gdb) n
11	    int i = 0, j = 5;
(gdb) p a
$3 = {1, 2, 3, 4, 5, 6}
(gdb) c
Continuing.

Breakpoint 3, main () at main.c:12
12	    while(i < j) {
(gdb) s
13	        swap(&a[i++], &a[j--]);
(gdb) s
swap (a=0x7fffffffddf0, b=0x7fffffffde04) at main.c:4
4	    *a = *a + *b;
(gdb) b 15
Breakpoint 4 at 0x40056e: file main.c, line 15.
(gdb) until
5	    *b = *a - *b;
(gdb) finish
Run till exit from #0  swap (a=0x7fffffffddf0, b=0x7fffffffde04) at main.c:5
main () at main.c:12
12	    while(i < j) {
(gdb) until

Breakpoint 4, main () at main.c:15
15	    return 0;
(gdb) p a
$4 = {6, 5, 4, 3, 2, 1}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值