如何用GDB调试

哈佛公开课CS50新学到一些GDB调试的操作。

GDB功能:

可以设置断点,按步执行

示例:swap.c文件 

代码如下:

#include <stdio.h>

void swap(int *, int *);

int 
main(void)
{
    int a = 1, b = 2;
    printf("a = %d, b = %d\n", a, b);
    swap (&a, &b);
    printf("now:\n");
    printf("a = %d, b = %d\n", a, b);
}

void
swap (int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

#gdb swap    进入gdb调试  

~/workspace/src/A/ $ gdb swap
Reading symbols from swap...done.
(gdb) 
break 设置断点:

break main  设置main函数断点

(gdb) break main
Breakpoint 1 at 0x42d422: file swap.c, line 8.
break 23     根据行号断点

break swap swap函数断点


run 运行到断点处

Starting program: /home/ubuntu/workspace/src/A/swap 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at swap.c:8
8           int a = 1, b = 2;

next 执行下一步,会跳过函数调用

n next简写

(gdb) n
9           printf("a = %d, b = %d\n", a, b);
(gdb) n
a = 1, b = 2
10          swap (&a, &b);

step 进入调用函数

(gdb) step
swap (x=0x7fffffffde1c, y=0x7fffffffde18) at swap.c:19
19          temp = *x;

backtrace 显示来自哪里

(gdb) backtrace 
#0  swap (x=0x7fffffffde1c, y=0x7fffffffde18) at swap.c:19
#1  0x000000000042d44d in main () at swap.c:10

print x 显示x的值

(gdb) print x
$1 = (int *) 0x7fffffffde1c
(gdb) print temp
$2 = 1
(gdb) print *x
$3 = 1

list 查看上下文,带行号
(gdb) list
15      void
16      swap (int *x, int *y)
17      {
18          int temp;
19          temp = *x;
20          *x = *y;
21          *y = temp;
22      }

print        打印地址,数据大小等。

(gdb) print x
$4 = (int *) 0x7fffffffde1c
(gdb) print x+1
$5 = (int *) 0x7fffffffde20
print a+n  
(gdb) print *x
$6 = 1
(gdb) print *(x+2)
$7 = 0
(gdb) print x+2
$11 = (int *) 0x7fffffffde24
(gdb) print &x
$12 = (int **) 0x7fffffffdde8
(gdb) print *(x+2)
$13 = 0
(gdb) continue
Continuing.
now:
a = 2, b = 1
[Inferior 1 (process 1826) exited normally]

continue 过掉断点,继续执行,直到下一个断点
(gdb) continue
Continuing.
now:
a = 2, b = 1
[Inferior 1 (process 1826) exited normally]
(gdb) 

continue n 经过n个断点,到第n+1个断点停下

(gdb) break foo
Breakpoint 1 at 0x42d4a5: file testloop.c, line 16.
Breakpoint 1, foo (x=0) at testloop.c:16
16          printf("i = %d\n", x);
(gdb) continue 5
Will ignore next 4 crossings of breakpoint 1.  Continuing.
i = 0
i = 1
i = 2
i = 3
i = 4

Breakpoint 1, foo (x=5) at testloop.c:16
16          printf("i = %d\n", x);
(gdb) 

测试代码:

#include <stdio.h>

void foo(int);

int
main(void)
{
    for (int i=0; i < 100; i++)
    {
        foo(i);
    }
}

void foo(int x)
{
    printf("i = %d\n", x);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值