gcc/g++形成的可执行程序默认是release版的。若要生成debug版,应使用-g选项。
如:gcc -o mytest test.c -g -std=c99
可以看到debug版包含了调试信息:

使用:gdb 文件名:

补充:
以下所有的查看指令都不会影响调试运行的执行流。
显示代码:l或list
gdb启动后输入l 行号,显示从指定行开始的一部分代码。
如果只输入l,会随机显示一定行数。
后续再输入l,或按回车,会显示后续几行的内容,直到显示了全部内容。

运行:r或run
不打断点直接使用r相当于在VS下直接按F5:

调试过程中再次r可以选择从头开始运行:

断点:b或breakpoint
打断点
方式1:b 行号 或 b 源文件名:行号

方式2:b 源文件名:函数名

↑断点的行号是函数内容的起始位置,而不是函数名的所在行。
查看断点:info b。
这里的Num是断点的编号,Enb是断点有效性,为n则该断点为空断点。

删除断点:d 断点编号。
设置空断点:disable breakpoint 断点编号。
重新启用空断点:enable breakpoint 断点编号。
打断点后再r就会在断点处停下,此时再info b会显示断点被命中的次数

运行到下一个断点(相当于VS打断点后F5):c或continue

逐过程(相当于VS的F10):n或 next
逐函数执行,执行完后不会停在函数末尾,而是会来到下一行。
相比VS,gdb的逐过程执行需要程序已经开始测试运行,而不能没运行就直接n,所以会需要断点辅助。

逐语句(相当于VS的F11):s或step
从断点处往后执行一条语句,遇到函数则进入函数逐语句执行。
查看当前的函数调用链:bt
会从栈顶到栈底显示调用的函数。

查看当前变量值:p 变量名

常显示变量值:display 变量名
可显示内置类型,以及结构体等自定义类型。
每个常显示的变量都会有对应编号用于管理 。

取消常显示:undisplay 变量编号

不打断点运行到指定行数(用于跳过循环):until 行号

执行完当前函数:finish
进到函数内以后,不依靠断点而将当前函数执行完毕后停下并显示函数的返回值。

调试过程中将变量设为特定值:set var 变量名=目标值




















