GDB可以对各种源代码行、代码地址、源代码文件中的行号或函数的入口等。之所以GDB可以对可执行文件进行调试,是因为在源代码编译成可执行文件时使用了gcc命令中的-g选项,这个选项告诉编译器,在编译成可执行文件是保留符号表。而符号表是GDB能够调试的关键,里面包含了源代码和行号的对应关系,当GDB进行调试时可以看到调试的位置。GDB使用ctrl + x + a快捷键可以将gdb的界面改变成界面的形式,如果再次使用这个快捷键,则会切换回去。Ctrl + x + a的界面图:
GDB调试中一共有三种暂停机制,分别是:
1、 断点:通知GDB在程序中特定位置暂停执行。
2、 监视点:通知GDB当特定内存位置或者涉及一个或多个位置的表达式的值发生变化时暂停执行。
3、 捕获点:通知GDB当特定事件发生时暂停执行。
break function:意思是在函数function的入口(第一行可执行代码)处设置断点。
breakline-number:在当前活动源代码文件的line-number处设置断点。对于多文件程序,当前活动窗口要么是上次使用list命令查看内容的文件,要么是包含main函数的文件。
breakfilename:line-number:在源代码文件filename的line-number处设置断点。如果filename不再当前工作目录中,则可以给出相对路径名或者完全路径名来帮助GDB查找该文件。如: break source/bed.c:35
break filename:function:在文件filename中的函数function入口处设置断点,重载函数或者使用同名静态函数的程序可以需要使用这种形式:break bed.c:parseArguments.
1、 使用break + offset或break – offset,可以在当前选中桟帧中正在执行的源代码行前面或后面设置断点偏移行数。
2、 break *address这种形式可用来在虚拟内存地址处设置断点。这种对于程序没有调试信息的部分(比如当源代码不可用时,或者对于共享库)是必须的。
临时断点是首次到达后就会自动删除的断点,使用tbreak设置临时断点。
rbreak命令采用grep风格的正则表达式,如rbreak func*会将断点放在名为func和funcc的函数上,而不会放在function上,其次,在rbreak的参数前面或后面有一个暗指的.*,因此,如果不希望rbreak func在afunc上设置断点,应当使用rbeak ^func。
如果在同一个位置设置了多个断点,那么运行GDB时,只会在这个位置触发一次中断,除法中断的断点将是标识符编号最小的断点。
GDB实际上是使用机器语言指令工作的,但是有了增强的符号表,GDB表现出了使用代码行的错觉,实际上,有时代码经过优化之后,GDB会跳过无用代码,所以GDB有时会给我们产生一种错觉感。
当断点被设置时,断点就会被标识成从1开始的一个整数,这个标识是这个标号的一个记号,从开始到最后,这个标号就代表这个这个标号。如果忘记标号可以使用Info breakpoints 或者简写的info bp命令进行查看。
焦点也就是前面所说的活动文件,调试可执行文件时,初始的活动文件是main函数文件。改变焦点的方法有如下几种:
1、 向不同的源文件应用list命令。
2、 进入位于不同的源代码文件。
3、 当在不同的源代码文件中执行代码时GDB遇到断点。
原文地址:http://blog.csdn.net/qianligaoshan/article/details/46382095