【例】通过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