启动GDB后,首先就是要设置断点,程序中断后才能调试。在gdb中,断点一般有三种形式:函数
断点(BreakPoint):操作系统
在代码的指定位置中断,这个是咱们用得最多的一种。设置断点的命令是break,它一般有以下方式:线程
能够经过info breakpoints [n]命令查看当前断点信息。此外,还有以下几个配套的经常使用命令:调试
观察点(WatchPoint):进程
在变量读、写或变化时中断,这类方式经常使用来定位bug。事件
能够经过info watchpoints [n]命令查看当前观察点信息it
捕捉点(CatchPoint):io
捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态连接库)、C++的异常等。一般也是用来定位bug。event
捕捉点的命令格式是:catch <event>,event能够是下面的内容function
另外,还有一个tcatch <event>,功能相似,不过他只设置一次捕捉点,当程序停住之后,应点被自动删除。
捕捉点信息的查看方式和代码断点的命令是同样的,这里就很少介绍了。
在特定线程中中断
你能够定义你的断点是否在全部的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工做。
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你能够经过"info threads"命令来查看正在运行程序中的线程信息。若是你不指定thread <threadno>则表示你的断点设在全部线程上面。你还能够为某线程指定断点条件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
当你的程序被GDB停住时,全部的运行线程都会被停住。这方便你你查看运行程序的整体状况。而在你恢复程序运行时,全部的线程也会被恢复运行。那怕是主进程在被单步调试时。
恢复程序运行和单步调试
在gdb中,和调试步进相关的命令主要有以下几条:
PS:这些命令大部分能够简写为第一个字母,在平常使用过程当中,每每只会输入第一个字符便可执行该命令,我标红的便是一般的使用方式。这几条命令使用很是频繁,而且能够带一些附加参数以实现高级功能,须要熟练掌握。