第六课 GDB调试 (上)
1序言:
1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率。有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办呢,这个时候就要调试了。说到调试有经验的开发童鞋知道在windows下游大名鼎鼎的VS集成平台,那么在linux下呢,特别是编写C、C++有什么工具可以方便我们调试呢,这里我给大家推荐的就是GDB,它也是GNU的debugger,专门为调试而生的。
2知识点:
2.1gdb的大致分为以下功能:
2.1.1.启动程序;
2.1.2.可以在通过断点进行调试;
2.1.3.在断点住停止可以查看运行的状况;
2.1.4.可以动态的改变执行的环境,包括系统环境,系统变量,局部变量等等;
2.2gdb相关命令说明
2.2.1 file <filename>:加载可执行文件;;
2.2.2 r:run的简写,表示运行程序,如果有断点,会在第一个断点出暂停;
2.2.3 l:list的简写,列出相关的函数代码或者是行代码(包括其他文件),好像最多10行吧,也可以使用l 1,10:指定显示1到10行;
2.2.4 b function或b num:b就是breakpoint的简写,表示在function函数是打断点,或者是在num行号处打断点,也可以在循坏中使用:b if i=10表示在循环中i=10的时候暂停;
2.2.5 d num:删除编号从1开始的断点,不指定则全部删除;
2.2.6 s:执行下一句语句,Step Into (单步跟踪进入),如果有函数则进入函数内部;
2.2.7 n:执行下一句语句,Step Over (单步跟踪),如果有函数也不会进入函数内部;
2.2.8 p:print的简写,打印某个变量的值,也可以打印变量、数组地址,注意查看动态分配的数组使用:p arry@10,其中10为arry变量内存的长度,改变运行时的数据:p x=100;
2.2.9 ptype:查看变量的类型;
2.2.10 i:info的简写,可以显示出好多信息;
2.2.11 q:quit的简写,表示退出当前命令;
2.2.12 help <name>:表示查看相关gdb命令的手册说明;
2.2.13 until:退出当前函数;
2.2.14 finish:运行到当前函数结束前,如果偶返回值则提示返回值;
3原理:
3.1在编译的时候附加上调试信息(比如断点,输出调试信息等等),执行gdb调试,程序会按照调试信息顺序执行有断点的地方暂停,有调试信息输出就输出等等方便程序员调试程序,一遍观察程序在运行的一切。下面通过创建一个简单的例子来说明gcc编译,gdb的启动以及调试步骤。
4实践:
4.1.先创建一个简单的gdbtest.c文件,内容如下:
#include <stdio.h> int main(void) { int a = 1; int b = 2; int c = a + b; printf("result :%d",c); return 0; }
4.2.编译如下:
gcc -Wall -g gdbtest.c -o gdbtest #-g参数
4.3.启动gdb,并加载gdbtest可执行文件:
gdb #直接在当前gdbtest.c目录中键入gdb命令就会进入调试器
file gdbtest #在gdb命令下输入此命令加载文件,输出Reading symbols from gdbtest ... done表示加载完成
4.4.使用命令l查看文件此时会列出代码以及标记行好,记住行号或者函数名称以便打断点;
4.5.使用格式:b 函数(行号)打断点,输入命令:b main或者:b 3效果都是一样!
4.6.使用r命令运行程序会在断点处暂停,此时可以使用s命令执行下一步(n命令是函数也一并执行,s命令会进入函数内部),断点出暂停后也可以使用c命令继续执行,可以使用p打印变量信息查看相关变量:
4.7.也可以使用命令:disassemble main查看main函数的汇编代码,这应用是更高级的技巧了!,当不需要调试要退出的时候使用q命令即可。
这节课就先讲到这里,先了解下gdb以及简单运动gdb做简单的调试。明天继续!!1