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
进到函数内以后,不依靠断点而将当前函数执行完毕后停下并显示函数的返回值。