哈佛公开课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);
}