Linux编程基础——GDB(设置断点)(转:TianFang,cnblog: http://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html)

启动GDB后,首先就是要设置断点,程序中断后才能调试。在gdb中,断点通常有三种形式:

断点(BreakPoint):

在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式:

  • break <function>    在进入指定函数时停住
  • break <linenum>    在指定行号停住。
  • break +/-offset    在当前行号的前面或后面的offset行停住。offiset为自然数。
  • break filename:linenum    在源文件filename的linenum行处停住。
  • break ... if <condition>    ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令:

  • delete    删除所有断点
  • delete breakpoint [n]    删除某个断点
  • disable breakpoint [n]    禁用某个断点
  • enable breakpoint [n]    使能某个断点

观察点(WatchPoint):

在变量读、写或变化时中断,这类方式常用来定位bug。

  • watch <expr>    变量发生变化时中断
  • rwatch <expr>    变量被读时中断
  • awatch <expr>     变量值被读或被写时中断

可以通过info watchpoints [n]命令查看当前观察点信息

捕捉点(CatchPoint):

捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。

捕捉点的命令格式是:catch <event>,event可以是下面的内容

  • throw     C++抛出的异常时中断
  • catch     C++捕捉到的异常时中断
  • exec    调用系统调用exec时(只在某些操作系统下有用)
  • fork    调用系统调用fork时(只在某些操作系统下有用)
  • vfork    调用系统调用vfork时(只在某些操作系统下有用)
  • load 或 load <libname>     载入共享库时(只在某些操作系统下有用)
  • unload 或 unload <libname>    卸载共享库时(只在某些操作系统下有用)

另外,还有一个tcatch <event>,功能类似,不过他只设置一次捕捉点,当程序停住以后,应点被自动删除。

捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。

在特定线程中中断

你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

  • break <linespec> thread <threadno>
  • break <linespec> thread <threadno> if ...

linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如:

(gdb) break frik.c:13 thread 28 if bartab > lim

当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

恢复程序运行和单步调试

在gdb中,和调试步进相关的命令主要有如下几条:

  • continue    继续运行程序直到下一个断点(类似于VS里的F5)
  • next        逐过程步进,不会进入子函数(类似VS里的F10)
  • setp        逐语句步进,会进入子函数(类似VS里的F11)
  • until        运行至当前语句块结束
  • finish    运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)

PS:这些命令大部分可以简写为第一个字母,在日常使用过程中,往往只会输入第一个字符即可执行该命令,我标红的即是通常的使用方式。这几条命令使用非常频繁,并且可以带一些附加参数以实现高级功能,需要熟练掌握。

时间: 2024-11-05 19:02:25

Linux编程基础——GDB(设置断点)(转:TianFang,cnblog: http://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html)的相关文章

Linux编程基础——GDB(设置断点)

启动GDB后,首先就是要设置断点,程序中断后才能调试.在gdb中,断点通常有三种形式: 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种.设置断点的命令是break,它通常有如下方式: break <function>    在进入指定函数时停住 break <linenum>    在指定行号停住. break +/-offset    在当前行号的前面或后面的offset行停住.offiset为自然数. break filename:linenum

001编程基础----GDB程序调试

一.GDB是GNU发布的程序调试工具.有三方面功能: 1.启动被调试程序. 2.让被调试程序在指定位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). 二.GDB调试步骤: 1.编译生成可执行文件 gcc -g hell.c -o hello 2.启动GDB gdb hello 3.在main函数处设置断点 break main(或b main) 4.运行程序 run 5.单步 next 6.继续运行 continue(或c) 7.退出GDB   quit 三.GDB命令的常用操作 l

linux编程基础汇总贴

linux编程基础汇总贴http://newzol.cn/forum.php?mod=viewthread&tid=67&fromuid=3(出处: newzol) 1.管道 http://newzol.cn/forum.php?mod=viewthread&tid=15&extra=page%3D2 2.基于管道的简单服务器 http://newzol.cn/forum.php?mod=viewthread&tid=14&extra=page%3D2 3.

Linux编程基础

一.Linux编程环境 1. 程序编辑器: 命令模式: i(insert):插入 a(after):之后插入 x():删除字符 dd:删除一行 :行号进行指定 :/字符串:搜索字符串 :q,退去 :wq ndd:删除n行 yy:复制当前行 p:粘贴 ny:从当前航开始复制 2. gcc gcc -s  text.c gcc  -c text.c gcc -o text  text.c gcc -o text test1.o text2.o 二.调试工具 1. gdb 执行调试命令:gdb tes

Linux编程基础-emacs简单配置

最近笔者又回到了Linux~浪了一圈又回来了 不过emacs确实不错,看起来也高大上(哈哈),今天就把我的配置文件贴上吧 要修改.emacs配置文件的话,只需要在emacs界面中按住control+X,松开后再按Control+F, 然后输入路径~/.emacs就好了,使底部命令行显示成这样: Find File: ~/.emacs,按回车就可以了 ;; 指针颜色设置为白色 (set-cursor-color "white") ;; 鼠标颜色设置为白色 (set-mouse-color

linux编程基础(三)

1.1 for循环语句      在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行.     它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数.这使得for循环能够知道在迭代过程中的执行顺序. 1.1.1 shell中的for循环 shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环:第三种就类似于C语言. ①   列表for循环(常用) #!

linux编程基础--什么是I/O

I/O是input/output的缩写,即输入输出端口.每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息.CPU与外部设备.存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器接口.存储器通常在CPU的同步控制下工作,接口电路比较简单:而I/O设备品种繁多,其相应的接口电路也各不相同,因此,习惯上说到接口只是指I/O接口. 1接口分类编辑 I/O接口的功能是负责实现CPU通过系统总线把I/O电路和外围设备联系在一起,按照电路和设备的复杂程度,I

linux安全基础:设置系统超时

主要内容:为远程终端设置一个连接超时时间(即多久没下达新指令将会断开服务器和终端的连接) [[email protected] ~]$ echo $TMOUT    #-->查看TMOUT变量 [[email protected] ~]$ export TMOUT=10    #-->设置TMOUT变量 [[email protected] ~]$ echo $TMOUT 10 [[email protected] ~]$  等待输入超时:自动登出 Last login: Thu Jul 21

gdb调试带参数程序(转:笑笑小白,cnblog http://www.cnblogs.com/rosesmall/archive/2012/04/10/2440514.html)

一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要 把调试信息加到可执行文件中.使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > cc -g hello.c -o hello > g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名.变量名,所代替的全是 运行时的内存地址.当你用 -g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他. 启动 GDB的方法有以下几种