目录
disable /enable(关闭或者打开断点的使能enable)
gdb的使用
gdb xx
xx代表某个debug版本的可执行文件,如果是release版本无法调试。
回车键
在gdb模式下执行一个指令后,回车键就变成了这条指令的快捷方式,按回车键可以直接执行这个指令。比如我现在执行list指令,那么gdb模式下,目前回车键就是执行list指令的快捷方式。但此时输入其他指令,回车键也会变成其他指令的快捷方式。
list 或者 l(list的简写)
进入gdb模式后,list 或者 l 可以查看代码详情。一次只显示一部分,所以可以继续输入list或者 l 显示剩余代码,由于回车键的特殊性,可以直接回车显示剩余代码。l 0可以从第一行开始向下显示。
quit
进入gdb模式后,quit可以退出调试。
run或者r
进入gdb模式后,run命令可以让程序走到断点的位置,对应vs编译器上的热键F5。
注意:
1.当程序中没有断点时,F5和run命令是不会让程序执行到某处后停下来的,会直接跑完程序并安全退出。
2.比如说最开始的断点在第3行,现在程序执行到了第9行,此时想回到第3行重新开始调试可以直接再次输入run或者r。
b(breakpoint断点)
b n,即可完成打断点的操作,n代表行号。如图:
next或者n(逐过程,对应vs编译器的F10)
进入gdb模式后,执行run语句并且成功让程序执行到某一个断点处停下来后,next或者n就可以让
程序跳转到下一个有代码的行继续执行代码,因为空行是不需要执行的,next会直接跳过空行。
step或者s(逐语句,对应vs编译器的F11)
进入gdb模式后,执行run语句并且成功让程序执行到某一个断点处停下来后,step或者s就可以让程序逐语句执行。什么意思呢?因为当前行可能有函数调用,函数一般由多条语句构成,所以逐语句就是遇到函数调用时就进入函数里逐语句执行。也就可以得到一个结论,如果当前函数中没有函数调用,那逐语句和逐过程是等效的。
finish(vs编译器调试时不存在这种操作)
如果当前已经进入了一个函数,但此时想直接退出当前函数并且退出后立刻停止执行,等待下一步调试的指令。想完成这种操作就可以用finish,注意如果当前正在执行的语句所在的函数是main,finish将会无效。
until(跳转到对应语句)
until n,n代表行号,表示从正在执行的语句直接跳转到第n行。不建议跨函数执行。如果没有循环,不可以跳转到已经执行完毕的语句。
continue或者c(跳转逐个断点)
用于从正在执行的语句直接跳转到下一个断点处。当没有断点时,直接跑完所有剩余的语句后正常退出程序。
bt(调用堆栈)
可以用于查看调用的堆栈,如下图:
1. 由于栈是先进后出,如上图中,当前正在执行的语句所在的函数栈就是AddToTop,上图中的(top=100)表示top是函数的形参,100是用户传的实参。从上到下是栈顶元素到栈底元素。
2.调用堆栈只有先进入调试模式后才可以使用,比如vs编译器上,只有先F10,才可以在调试的窗口选项中找到调用堆栈这一选项,如果不进入F10调试模式,则找不到,如下图中就没有调用堆栈这个选项:
display(常显示)
和p不一样的是:p只会打印一次,之后输入其他调试指令,监视的变量就不打印了。而display xx后,xx代表变量名,不管输入什么调试指令,xx变量会一直打印,如下图:
undisplay
用于取消常显示。但注意:和删除断点一样,取消变量常显示也是取消变量对应的编号即可:
如下两张图:
disable /enable(关闭或者打开断点的使能enable)
1. disable n, n代表断点编号,而不是行号,如上图,disable 1后,1号断点的enb就变成了n(no的意思),而其他编号的断点是y(yes)。
2.关闭断点使能表示:断点仍然存在,只是作为断点,它的功能失效了。
p(监视)
p xxx,xxx代表变量名,可以打印变量的值。
info b(显示断点)
用于查看所有断点。如下图:
左边红框代表断点的编号,右边红框代表断点的行号。
delete或者d(删除断点)
用于删除断点,如上图,删除的时候不是delete 行号,而是delete 上图红框中的Num里的编号。