【例】通过vi创建两个.c文件main.c和add.c:

一步编译main.c和add.c文件,并加入调试信息:

1. 在被调函数中加断点时,在执行主函数时,会自动进入被调函数
(1)进入gdb,跟踪main程序:

(2)显示代码
输入l显示的是当前main.c的代码:

输入l 文件名:行号显示另一个文件中的代码:
输入l add:1显示add.c的代码

(3)设置断点
①在当前显示的文件中加断点
因为刚刚输入l add:1显示add.c的代码,所以此时加断点,是在add.c中加断点:


②显示别的文件,在别的文件中加断点
输入l main:1显示main.c中的代码:

这时可以在main.c中加断点:

③给指定函数加断点
给指定函数加断点是在函数开始的地方加了断点

(4)启动程序
输入r启动程序:

遇到第一个断点停止。
输入n单步执行:

查看a的值:

查看b的值:
由于此时b还没有赋值,因此b的值为0

查看a+b的值:

查看a和b的地址:

然后可以输入c继续执行,直到遇到第二个断点:

这里自动进入了函数add是因为在add里面加了断点。
继续单步执行:

此时,查看d的值:

继续执行,执行结果d的值也是5:

(5)退出gdb

2. 不在被调函数中加断点时,不会进入这个被调函数的内部
(1)进入gdb,跟踪main程序

(2)显示代码
直接显示main.c文件中的代码:

(3)设置断点

(4)运行程序

连续单步执行:

此时,如果继续单步执行,就会默认执行通过add:

查看d的值,仍然是正确的:

可以发现虽然gdb没有跟踪到add内部,跳过了add函数内部的执行过程,通过单步执行,add执行直接可以通过。
(5)退出gdb

3. 没有在被调函数加断点时怎么进入被调函数
(1)进入gdb,跟踪main程序

(2)显示代码
直接显示main.c文件中的代码:

(3)设置断点

(4)运行程序

此时,如果要进入add函数的内部,要输入s:

可以看到,这时就进入到add函数内部了。
当确定add函数内部没有错误时,退出add函数,输入finish:

这时就退出了add函数,重新回到了main函数。
(5)退出gdb




















