基础gdb调试
在学习C语言的过程中,你一定多多少少遇到过一些程序写错没能及时发现的情况。如果你没有过度的依赖IDE,你可能已经自己探索出了在程序中通过输出一些中间值的方式对程序进行调试。在这里,需要重新学习一个叫gdb的工具,它可以更方便地帮助你进行调试,让你“看见”程序在做什么,从而在过程中将一些不符合你预期的部分暴露出来。
通过gdb我们可以看见变量值的变化、决定程序什么时候继续执行下一步或是发现奇怪的内存访问行为。
要充分的利用gdb帮助我们找到程序编写时候的问题,我们需要在编译时使用-g作为一个编译参数(否则你将看不见函数名、变量名,而只能看到运行时的内存地址),例如:
再通过
gdb ./program
将程序在gdb提供的一个“受控制的环境”中运行起来。
这时候你会看到一系列关于gdb的说明和下面这样一个等待你通过命令进行调试的命令行。
如果你输入l(list的首字母),gdb会列出带着行号的10行程序,你可以根据这个行号进行进一步的调试。1之后可以加行号作为参数,列出这一行开始的10行(例如希望列出第1到10行时,我们可以写11)。
如果你输入b(breakpoint的首字母),则表示设置程序运行的断点,程序运行到断点时就会暂停运行。b之后既可以加函数名作为参数(例如当有一个函数名为func时,我们可以写bfunc),使程序在调用某一函数时暂停;也可以加行号作为参数(例如b5表示在第五行设置一个断点),使程序在运行某一行时暂停。
如果你输入r(run的首字母),程序则会开始运行,并且暂停在我们设置了断点的位置。
- 运行暂停时,我们如果输入p表达式(print的首字母)则表示我们希望在当前断点运行这个表达式并查看它的值。例如
p++age[e]表示我们希望让age[e]自增1并查看自增后的值。注意:这个表达式会对之后的程序继续运行造成影响。 - 运行暂停时,如果我们输入n(next的首字母)程序会执行暂停位置后的下一条语句并再次暂停。
- 运行暂停时,如果我们输入c(continue的首字母)程序会继续执行到下一关断点再暂停(如果没有断点就会执行直到结束)。