一、GDB概述
Linux下的GDB调试器,是一款GNU组织开发的UNIX/Linux下的程序调试工具,它没有图形化的友好界面,但功能强大。
二、准备工作
(a) 安装GDB: apt install gdb
(b) 创建main.cpp文件
vim使用技巧:在按esc进入命令模式下,在!后可直接输入命令行进行执行,还可以进行上下键查看历史命令。这样可以在不退出vim的情况下进行编译,从而及早发现问题。
三、GDB常用命令及调试实例
由于调试程序是个极为频繁的操作,所以GDB的所有命令,只要不出现冲突,都可以进行简写,如list可直接简写为l,break可直接简写为b。
为了方便调试,修改main.cpp如下:
(1) 编译成debug版
执行 g++ main.cpp -g -o main (注意若不加- g 选项,则生成的是release版本,使用GDB工具进行调试会提示找不到符号。)
(2) 使用GDB对debug版本的可执行文件进行调试
执行 gdb main
【查看代码】
(1) list<行号> | <函数名> 查看指定行号的代码或者函数(在前面会自动多展示几行)
【控制程序运行】
(2) break 行号 | 函数名<条件表达式> 设置断点
使用 info break ,查看断点信息:
使用 delete (Num) ,删除断点:
(3) run 运行函数到断点处或者程序结束
(4) next 单步运行一条指令,不进入函数(把整个函数当成一行命令执行)
(5) step 单步运行一条指令,进入函数(真正的单条语句运行)
(6) continue 继续执行,直到遇到新断点或者程序结束
(7) watch 变量|表达式 观察变量或者表达式的值,只要其发生变化,则停止。
这个例子不是上述代码,反正比较简单,就是定义个 int i =0; 然后 i++;
【打印和设置内存变量】
为测试方便,修改代码如下:
(8) print 变量|表达式 查看当前指定变量或表达式的值
(9) set 变量名=新值 设置内存中指定变量的值,若出现不明确,需要加上var指明是程序中的变量
【查看程序调用栈】
为方便测试,修改main.cpp如下:
(10) backtrace 当程序宕掉时,查看程序调用栈
所以说GDB是在Linux编程中必须使用的工具, 没有GDB,在出现错误的时候很难想象错误发生在哪里。另外在Linux中也有这样的好处,就是当程序宕掉了基本不会对系统造成影响,而在windows中程序宕掉甚至会使系统产生异常,所以Linux是比较稳定可靠的,适合做服务器。
段错误调试:使用Core Dump查找程序宕掉的原因,可参考如下博客,讲得很详细: