第六课 GDB调试 (上),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的简写,打印某个变量的值;

    2.2.9 i:info的简写,可以显示出好多信息;

    2.2.10 q:quit的简写,表示退出当前命令;

    2.2.11 help <name>:表示查看相关gdb命令的手册说明;

    2.2.12 until:退出当前函数;

    2.2.13 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


linux中gdb调试器中的 l 命令 有些用法不太明白

很多,但是通用的命令基本都一样;了解Linux的目录基本结构,怎么给各种硬件命名的(当初我才接触Linux的时候就被它对硬盘分区的命名规则搞晕了),了解用户是怎样通过Linux内核跟硬件打交道的;还可以找个Linux的发行版如现在比较火的Ubuntu等熟悉下怎么配置它的各种服务;然后如果是你以后从事在Linux下的开发工作,那么可以学习在Linux系统下面编程,C/C++等等,掌握编译器GCC/G++,调试器GDB的基本用法,学习写Makefile管理你的工程等等;推荐几本书:《Linux标准学习教程》(虽然是针对Red Hat Enterprise Linux 4讲的,但是前面我说过,基本命令都差不多,配置文件有些地方各个发行版不一样)、《UNIX/Linux编程实践教程》(即Understanding UNIX/Linux Programming)、《UNIX环境高级编程》(即Advanced Programming In The UNIX Environment)。前两本入门用,现在我才看到第二本,最后一本还没看过,特别厚,评价都说很经典!然后你再想学就自己找个方向学吧,比如应用层开发,驱动层开发,内核研究等。最后祝你成功!
另外,站长团上有产品团购,便宜有保证
 

linux中gdb调试器中的 l 命令 有些用法不太明白

list 命令加行号的话,不是要打印第 10 之后的内容,而是打印第 10 行周围的内容,也就是第 10-10/2 行 到 10 + 10/2 行的内容。
在 gdb 中使用 help list 会有详细说明。
 

相关内容