gdb版本检查和安装
版本检查
通过指令判断你的版本和是否安装gdb
· gdb --version
安装
· yum install -y gdb
Debug和Release
我们知道我们编写的代码会有Debug和Release两个版本;Debug版本是我们程序员在实现某一个项目时使用的版本,可以进行各种调试;而Release版本时我们项目完成后,用户使用项目时的版本,不可以调试并且系统会做优化。
在Windows下的集成开发环境默认为Debug版本,而在Linux下默认为Relase版本。
如何证明在Linux下默认为Release版本呢?
· 通过能否调试判断为Debug还是Release,Debug可以调试Release不可以调试。
1 #include<stdio.h> 2 int Sum(int n) 3 { 4 int i=0; 5 int sum=0; 6 for(i=1;i<=n;i++) 7 { 8 sum+=i; 9 } 10 return sum; 11 } 12 int main() 13 { 14 int n=100; 15 int ret=Sum(n); 16 printf("%d \n",ret); 17 return 0; 18 }
我们在Linux下编写这样一段代码进行测试。
· 通过判断可执行程序的大小判断; Debug系统没有优化比较大,Release系统优化比较小;
因为Debug版本会添加调试信息,所以Debug版本文件会比Release版本大。
通过查看Debug版本和Release版本的文件信息判断,上面说到Debug版本会添加调试信息;而Linux我们的可执行程序是ELF格式,我们可以通过这一点配合查询和管道在我们的Debug版本下查找是否有Debug的内容。
gdb的使用
· gdb [可执行程序文件名]
· 退出: ctrl + d 或 quit 调试命令
· l 行号/函数名:从指定行号/函数开始打印10行 (不是输入行号/函数名从默认位置打印10行
· break(b):打断点
· info break :查看断点信息
· disable:关闭断点
· enable:启用断点
· c :跳转到下个断点
· d 断点编号:删除断点(不可以通过行号删除)
· r :运行程序
· s :逐语句执行
· n:逐过程执行
· finish :运行至当前函数结尾
其他指令
· diaplay [变量名]:追踪查看变量,显示变量所有信息
· undisplby [变量名]:取消追踪
· until 行号:跳转到X行
· bt :调用堆栈
· break 函数名:在某个函数开头设置断点
· print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
· p 变量:打印变量值。
· set var:修改变量的值
· delete breakpoints:删除所有断点
· delete breakpoints n:删除序号为n的断点
· info(i) locals:查看当前栈帧局部变量的值
Linux下包括软件的安装(yum)、代码编辑(vim多模式编辑器)、代码编译(gcc/g++编译器)、代码调试(gdb),自动化构建代码(make/makefile),这五种开发工具就介绍完了。每个开发工具多多少少都会有一些指令,不用可以去记忆这些指令,可以的去用指令刻意练习,慢慢就会熟练使用指令。