linux下如何使用gdb调试
gdb是linux下非常好用的一个调试工具,虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,这里简单介绍下gdb下常用的命令。
首先编译生成可执行文件(这里的test.c是一个简单的求前n项和的程序)。
gcc -g test.c -o test(-g选项告诉gcc在编译程序时加入调试信息)。
接下来可以这样。
gdb test
然后你就会看到出现好多信息在屏幕上,大致说的是gdb的一些版本信息说明之类的,但是它对你调试程序没用呀,所以,你可以加上-q选项,不输出它们。
gdb -q test
wang@king:~$ gdb -q test
Reading symbols from test...done.
(gdb)
有没有觉得这个世界一下子清净了许多。
也可以先进入gdb模式,然后再加载文件。
wang@king:~$ gdb -q
(gdb) file test
Reading symbols from test...done.
(gdb)
好了,现在开始调试了,但是我还想看看我的代码怎么办,gdb提供了一条命令,可以让你的程序显示出来。
(gdb) //list默认一次显示10行
#include<stdio.h>
int func(int n)
{
int i;
int sum=;
for(i=;i<n;i++)
{
sum+=i;
}
return sum;
(gdb) //直接输入回车重复上次命令,显示接下来的10行
}
int main()
{
int n;
printf("请输入n的值");
scanf("%d",&n);
printf("1+2+..+%d=%d",n,func(n));
return ;
}
(gdb)
list默认参数可以用show listsize来查看,如果感觉10行太多或者太少,还可以用set listsize <count>来更改。
list 还可以加上其他参数,比如:
list 5,10 显示第5行到第10行的代码;
list func 显示func函数周围的代码,显示范围和list参数有关;
list test.c:5,10 显示源文件test.c第5行到第10行的代码,一般用于调试含多个源文件的程序。
gdb 还支持字符串查找,search str,从当前行开始,向前查找含str的字符串;
reverse-search str,从当前行开始,向后查找含str的字符串。
现在你的屏幕应该被占满了吧?想清空屏幕,可是还在gdb里面呀,怎么办?其实,gdb也支持运行linux命令的,可以在gdb的提示符中,输入shell,然后在输入你需要的命令就可以了
(gdb) shell clear
这样也能达到清屏的效果。
看了程序的代码,感觉第6行代码可能有点问题,现在就需要我就需要设置一个断点,让程序停在第6行之前。
(gdb) break
Breakpoint at 0x80484c8: file test.c, line .
(gdb)
下面一行的 信息,1说明我设置的这个断点是第一个断点,断点所在内存地址为0x80484c8,它在文件test.c的第6行。
gdb还可以以条件表达式设置断点。
(gdb) break if n==
Breakpoint at 0x80484d1: file test.c, line .
(gdb)
这个断点的含义是,如果n的值为6,则程序运行到第7行停止。
当然,还可以直接在某个函数处设置断点;直接break 函数名就可以了,
然后我们想看下设置的断点信息,可以使用info breakpoints命令。
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080484c8 in func at test.c:
breakpoint keep y 0x080484d1 in func at test.c:
stop only if n==
breakpoint keep y 0x080484c1 in func at test.c:
(gdb)
Num表示断点的编号;Type表示断点的断点的类型,第二个断点类型还加上了条件;Disp表示中断点在执行一次之后是否失去作用,dis为是,keep为不是;Enb表示当前中断点是否有效,y为是,n为否;Address表示中断点所处的内存地址;What指出断点所处的位置。
如果不需要程序在该断点暂停时,有两种方法,一种是使该断点失效,一种是直接删除该断点。
(gdb) disable
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep n 0x080484c8 in func at test.c:
breakpoint keep y 0x080484d1 in func at test.c:
stop only if n==
breakpoint keep y 0x080484c1 in func at test.c:
(gdb)
可以看到,第一个断点的Enb变为n了,表示该断点已经无效了,如果需要恢复,可以使用enable命令。这里需要注意的是,disable后面的参数为断点的编号。而不是行号。
直接删除该断点,可以使用clear命令和delete命令。
(gdb) clear
已删除的断点
(gdb)
clear命令后面的参数为设置断点的行号,clear后面参数还可以加设置断点的函数名。
delete命令后面的参数为断点的编号;可以一次删除多个断点,断点编号之间用空格隔开;如果delete后没有参数,默认删除所以断点,会给出提示选择是否操作。
(gdb) delete
删除所有断点吗? (y or n)
断点设置好了,现在就可以调试了,
(gdb) run //开始执行程序
Starting program: /home/wang/test
请输入n的值10 Breakpoint , func (n=) at test.c: //设置的第一个断点,程序在第6行暂停
for(i=;i<n;i++)
(gdb) continue //让程序继续运行,直到下个断点或者结束
Continuing. Breakpoint , func (n=) at test.c: //第二个断点设置的是i==6时停止
sum+=i;
(gdb) print i //用print命令打印出i的值
$ =
(gdb) print sum
$ =
(gdb) next //继续执行下一条语句,只执行一条。
for(i=;i<n;i++)
(gdb) next
sum+=i;
(gdb) print i
$ =
(gdb) continue
Continuing.
++..+=[Inferior (process ) exited normally]
(gdb) quit //退出gdb调试
上面出现了很多命令,下面就来说说都是怎么用的。
run,开始运行程序;
continue,程序暂停时继续运行程序的命令;
print 变量名或表达式,打印该变量或者该表达式的值。whatis 变量名或者表达式,可以显示该变量或表达式的数据类型。
print 变量=值,这种形式还可以给对应的变量赋值;类似的还有set variable 变量=值。作用和用print赋值相同。
next,继续执行下一条语句;还有一条命令step,与之类似,不同的是,当下一条语句遇到函数调用的时候,next不会跟踪进入函数,而是继续执行下面的语句,而step命令则会跟踪进入函数内部。
(gdb) run
Starting program: /home/wang/test Breakpoint , main () at test.c:
scanf("%d",&n);
(gdb) next
请输入n的值10
printf("1+2+..+%d=%d",n,func(n));
(gdb) next //next命令直接执行下一行,没有进入func函数
return ;
(gdb)
(gdb) run
Starting program: /home/wang/test Breakpoint , main () at test.c:
scanf("%d",&n);
(gdb) n
请输入n的值10
printf("1+2+..+%d=%d",n,func(n));
(gdb) step //step命令跟踪进入了func函数
func (n=) at test.c:
int sum=;
(gdb)
还有nexti和stepi命令,这两个是单步执行一条机器指令,比如(i=0;i<n;i++)这条语句需要输入多个nexti才能执行完;两个的区别和上面相同。
quit,退出gdb调试,如果调试中想要退出,可以直接输入该命令,会出现提示选择是否退出。kill命令,结束当前程序的调试,(不会退出gdb)。
(gdb) quit
A debugging session is active. Inferior [process ] will be killed. Quit anyway? (y or n)
linux下如何使用gdb调试的更多相关文章
- linux下如何用GDB调试c++程序
转:http://blog.csdn.net/wfdtxz/article/details/7368357 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形 ...
- [转] linux下的c/c++调试器gdb
PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...
- linux下的c/c++调试器gdb
Reference: http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C+ ...
- Linux下C语言的调试 - gdb
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...
- Linux下gcc与gdb简介
gcc编译器可以将C.C++等语言源程序.汇编程序编译.链接成可执行程序.gdb是 GNU 开发的一个Unix/Linux下强大的程序调试工具. linux下没有后缀名的概念.但 gcc 根据文件的后 ...
- Linux基础 30分钟GDB调试快速突破
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...
- Linux下C语言的调试--转
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
随机推荐
- 深入分析HashMap
本文基于jdk1.8 HashMap特点: HashMap具体方法分析: put方法分析: 执行流程图: public V put(K key, V value) { return putVal(ha ...
- 收到offer!
今天收到了自己中意的offer,公司在上海,这也意味着自己毕业后的第一份工作也要结束了. 要说再见了,杭州,尽管相处的时间不久,也认识了一些朋友.还得向他们做声道别. 心情滋味难名,短短的一年,自己由 ...
- 二、Internet地址结构
IP路由器实现的转发程序使用IP地址来识别流量去向.IP地址也表示流量来源. 2.1 IP地址的表示 IPV4地址通常采用点分四组或点分十进制表示法,如192.168.1.1. 点分四组表示法由四个用 ...
- python - class类 (六) 三大特性 - 多态
多态的概念: # 多态的概念 # 指出了对象如何通过他们共同的属性和动作来操作及访问而不需考虑他们的具体的类 # 多态表明了动态绑定的存在,允许重载及运行时类型确定和验证. # 示例模拟: #水具有多 ...
- Handler实现与机制 && Blocking Queue && IdleHandler使用
http://blog.csdn.net/boyupeng/article/details/46685343 IdleHandler处理消息的源码 final Message next() { ... ...
- java Comparable 和 Cloneable接口
Comparable接口定义了compareTo方法,用于比较对象. 例如,在JavaAPI中,Integer.BigInteger.String以及Date类定义如下 Cloneable接口 Clo ...
- 关于python中的类方法(classmethod)和静态方法(staticmethod)
首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...
- UML和模式应用5:细化阶段(2)--细化阶段制品之领域模型
1.前言 领域模型是OO分析中最重要和经典的模型.它阐述了领域中的重要概念: 领域模型作为设计某些软件对象的重要来源,也作为案例研究中探讨的几个制品的输入: 领域模型的范围限定于当前迭代开发的用例场景 ...
- 通过全备+binlog_server同步恢复被drop的库或表
MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 :伪master+Binlog+同步(本文 ...
- crontab定时作业
crontab用于在指定时间执行某项作业,如执行脚本或命令. 1.crontab -e 创建一个crontab文件,并添加作业(这个crontab的拥有者是创建者). 这里要注意:必须指定s ...