C++程序员必备知识
什么是GDB??
- GDB是GNU软件系统社区提供的调试工具,同GCC配套组成一套完整的开发环境,GDB是Linux和许多许多Unix系统中的标准开发环境。
- GDB主要的四个功能:
- 启动程序,可以按照自定义的要求随心所欲的运行程序
- 可以让被调试的程序在所指定位置的断点出停住(断点可以是条件表达式)
- 当程序被停止时,可以检查此时程序所发生的事
- 可以改变程序,将一个BUG产生的影响修正,从而测试其它BUG
准备工作
- 通常,在为调试而编译时,必须关掉编译器的优化现象(-0n),并打开调试选项 -g,另外,’-wall‘在尽量不影响程序行为的情况下打开,提示所有的warning
- -g选项的作用是在可执行文件中加入源代码信息,比如可执行程序文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能够找到源文件(-g的文件会比不加的大,而且我们在GDB中查看的时源文件的代码)
非调试命令
- 启动GDB
- gdb 可执行文件
- 查看代码(默认显示10行)
- l/list
- l 行号(函数名) ---->当前文件
- l 文件名:行号(函数名)---->跨文件
- 设置查看代码的行数(针对list)
- show list/listsize
- set list/listsize 行数
- 设置断点
- b/break
- b 行号(函数名)
- b 文件名:行号(函数名)
- b 行号 if i == 9 —设置条件断点
- delete/del/l 断点的编号
- info/i —查看所有断点
- i b —查看断点信息
- dis/display 断点编号 —设置断点无效
- ena/enable 断点编号 —设置断点生效
GDB调试
- 运行GDB程序(开始调试的第一步)
- start —程序停在第一行
- run —遇到断点才停
- 继续运行,到下一个断点停
- c/continue
- 向下执行一行代码(遇到函数不会进入函数体)
- n/next
- 变量操作
- p/print 变量名 —打印变量值
- ptype 变量名 —打印变量类型
- 向下执行一行代码(遇到函数会进入函数体)
- s/step
- finish(跳出函数体) —函数体里没有断点是前提
- 自动变量操作
- display num —自动打印指定变量的值
- i/info display —查看自动打印变量的信息
- undisplay 编号 —取消自动打印指定变量
- 其它操作
- set var 变量=变量值
- until(跳出循环体) —循环里没断点是前提