设置断点
break + 行号
:在某一行设置断点,beak也可简写为b,例如b 18
,在第18行打上断点,随后报出相应信息。
break + 函数名
:在某个函数开头设置断点。
如果有多个文件的话,可以指定文件名 + 冒号 + 函数名
查看断点
intfo break
:查看断点信息,Num
为断点编号,Type
为类型,What
表示断点设置在哪个位置。
⚠️注意:断点的编号是在一个调试会话中逐渐递增的,如果删除某一个断点,创建下一个断点后,那么这个断点的编号为上一个删除断点的后一个数字,删除断点不代表创建断点编号也会刷新,而是一直处于递增的状态。如果退出gdb调试,那么所有断点都会被清除!
删除断点
delete breakpoints
:删除所有断点。
delete n
:删除编号为n的断点,delete也可用d表示。
禁用断点
disable n
:禁用编号为n的断点。表示断点只是暂时禁用,但还是存在的。
禁用编号为1的断点之后,Enb
的值由y变成了n
将编号为2的断点禁用之后,我们使用r
命令,此时程序直接就跑出来了,因为断点都被禁用了。
启用断点
enable n
:启用编号为n的断点。
将编号为1的断点启用之后,我们使用r
命令,此时程序就在编号为1的断点位置停下来了。
逐过程
n
或next
:单条执行,相当于vs中的「F10」键,表示逐过程。
(gdb) b 18 Breakpoint 1 at 0x40055a: file mycode.c, line 18. (gdb) r Starting program: /home/Asi/study/day02/mybin Breakpoint 1, main () at mycode.c:18 18 int result = 0; (gdb) n 20 result = AddToTop(top);
以上代码,通过在第18行打上断点之后,输入r开始调试,再输入n,程序跳到了第20行,为什么不在第19行停下,因为19行为空格,停下没有意义。
逐语句
s
或step
:进入函数调用,相当于vs中的「F11」键,表示逐语句。
我们在上一步骤的基础上,输入s
,此时程序就进入了AddToTop()
函数里面。
查看变量的值
p + 变量
:打印变量值。注:只能再当前行显示,输入下一次命令时,就不会显示相关信息了。
如果想要像vs中监视窗口一样,一直可以观察到变量的变化状态,使用如下命令
display + 变量
:跟踪查看一个变量,每次停下来都显示它的值。
undisplay + 条目编号
:取消对先前设置的那些变量的跟踪。
info locals
:查看当前栈帧局部变量的值。
修改变量的值
set var
:修改变量的值
跳转
until + 行号
:用于使程序执行到指定行号的位置。
finish
:命令用于一直执行程序直到当前函数返回为止,然后在返回后停止执行。
使用 finish 命令可以跳过当前函数的剩余部分,直接返回到调用该函数的地方。
continue(或c)
:从一个断点直接运行到下一个断点处。
显示调用堆栈
breaktrace(或bt)
:显示调用堆栈。调用堆栈是程序执行期间函数调用的历史记录,它显示了函数调用的顺序以及每个函数在调用栈中的位置。