一起talk GDB吧(第二回:GDB单步调试)

各位看官们,大家好,我们在上一回中说简单地介绍了GDB。这一回中,我们介绍GDB的调试功能:单步

调试。闲话休提,言归正转。让我们一起talk GDB吧!

看官们,我们先说一下什么是单步调试。大家都知道,程序是按照指令,一步一步地执行,只是程序运行

的很快,所以你没有办法看到走过的每一步。这个有点类似我们平常走路,一步一步地向前走,在路上可

以看到许多风景,如果坐车,那么车速太快了,就会看不清楚路上的风景。单步调试就是不让程序很快地

执行,通俗点说,说是不让程序“坐车”走,让程序一步一步地运行。

我们来看看如何使用GDB让程序一步一步地运行。详细的步骤如下:

  • 1.启动GDB:gdb file.o(表示使用GDB对file.o这个程序进行调试);
  • 2.开始调试:start.这个时候,GDB会从file.o程序中的main函数开始执行;
  • 3.单步调试:next(可以缩写为n)。程序运行到下一条语句;
  • 4.反复调试:继续输入n,程序就会跳到下一行。如此反复,程序就会一步步地运行。

这里有个技巧和大家共享一下:执行完第一个n命令后,如果想继续执行n命令,那么只需要按下回车键就

可以继续执行n命令,而不需要继续输入n,因为在GDB中回车键表示重复执行它前面的命令,这个有点类似

Linux中的点命令。

在单步调试过程中遇到程序中的函数时,会把函数调用当做一个整体,大家可能不理解,没关系,咱们举个

例子:程序中有以下三条语句:

a =5;b = 3;

c =min(a,b); //min是求最小值的一个函数

printf("min is :%d",c);

当程序运行到“a =5;b = 3;”这行时,使用单步调试命令n,程序会运行到“c =min(a,b);”这一行,如果再执行

单步调试n,那么程序会运行到“printf("min is :%d",c);“这一行。大家都知道,函数是多个语句组成的,不

会一步就运行完,但是单步调试的时候把函数看成了一个整体,让它一步运行完。如果我们想看函数中每

个语句的运行步骤,怎么办?看官莫急,强大的GDB不会让我们失望的,我们可以使用GDB的命令:step

(缩写为s),使用该命令可以进入函数中。然后就能使用单步调试命令,一步一步地看清楚函数中每条语句

的运行步骤了。如果想从函数中跳出来可以使用命令:finish.这时程序会调用函数的地方,也就是我们例子

中“printf("min is :%d",c);“这一行。

看官们,通过单步调试,我们可以看到程序运行的“脚印”。在调试过程中,如果看到程序运行步骤与我们

事先给程序设计好的步骤不一样,那么说明程序没有按照我们设计的步骤走。这肯定是有地方出问题了,

我们需要把出问题的地方找出来。因为程序是一步一步地运行,所以我们很容易找到哪一步出了问题,进

而找出问题的原因。这便是单步调试的作用。当然了,单步调试还有其它的作用,它可以和其它调试方法

一起配合使用,至于是什么调试方法,我们以后在的章回中会介绍。

我们平时还觉得电脑上的程序不够快呢,你还不让它“坐车”,让它步行,这不让电脑更加慢了吗?看官说的

有道理。不过,我们通过单步调试让程序执行慢下来,目的是为了看清楚程序每一步执行时的样子,这样

有助于我们发现程序中错误,进而方便我们修改程序中错误。试想一下,程序“坐着车”跑的那么快,你还没

有看清楚它的样子,它已经跑的无影无踪,更不要说找它的执行时的错误了。

看官们,关于GDB的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 22:28:41

一起talk GDB吧(第二回:GDB单步调试)的相关文章

使用GDB 单步调试Android本地代码

转载:http://www.360doc.com/content/12/1228/11/9462341_256747689.shtml 下面就以GDB调试Rild为例,来说明如何调试Native进程. 说明 #cmd     表明该命令运行于android设备控制台上 $cmd     表明该命令运行于Linux PC控制台上 (gdb)cmd 表明该命令运行于GDB控制台上 1. 调试已运行的rild #ps | grep rild 得到rild的进程rild-pid #gdbserver :

gdb单步调试时top看不到所调试的进程

最近用gdb调试程序时,新开窗口用top命令查看调试进程的内存占用情况,但总遇到在单步调试时,由于程序执行太慢,top看不到调试进程的情况. 后查明,这是由于默认进入top时,各进程是按照CPU的占用量来排序的,单步调试程序执行太慢,有时cpu占用量为0. 解决办法:在top窗口用键盘敲"u",然后输入当前用户名,则top窗口显示的都为该用户下的进程信息. 其他一些有用也很有意思的top视图 多U多核CPU监控在top基本视图中,按键盘数字"1",可监控每个逻辑CP

GDB调试指南-单步调试

前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启动调试设置断点观察之后,没有我们想要的信息怎么办呢?这个时候,就需要单步执行或者跳过当前断点继续执行等等.而本文所说的单步调试并非仅仅指单步执行,而是指在你的控制之下,按要求执行语句. 准备 老规矩,先准备一个示例程序如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

gdb系列之四 在GDB里运行程序

在你开始在GDB里运行程序前,你需要在编译的时候产生调试信息. 你可以在你选定的环境里带参数(如果有的话)的启动GDB.如果你是在本地调试,你可以重定向输入输出,调试一个已运行 的进程,或者结束一个进程. 4.1 为调试而编译 为了有效的调试程序,你需要在编译的时候产生调试信息.调试信息存储在目标文件里:调试信息描述了数据和函数的类型, 源代码和可执行代码的对应关系. 编译时指定编译器的'-g'选项可以产生调试信息. 在编译给你的客户发布的程序时,可以用'-O'选项指定编译器进行优化.然而,许多

gdb动态挂运行程序并调试

/* * gdb动态挂运行程序并调试 * 编译程序: * gcc gdb_attach2.c -o gdb_attach2 -g * * 运行程序: * ./gdb_attach2 * * 查看程序进程代号: * ps ax | grep gdb_attach2 * 3973 pts/0 S+ 0:00 ./gdb_attach2 * * 启用gdb挂载程序: * gdb gdb_attach2 3973 * * 在目标位置设置断点 * b gdb_attach2.c:44 * Breakpoi

利用GDB在远程开发机进行调试

由于一些环境的制约,很多同学都可能需要在开发机上进行调试,但由于开发机资源的限制,在开发机上直接进行本地的GDB环境配置就成了难题,这个时候其实我们可以利用GDB中自带的gdbserver工具就可以进行远程开发机的调试. gdbserver可以走网络,串口等通信机制,对于网络来说支持ip:prot格式运行.比如你的开发机所在IP是192.168.3.11,你的机器是192.168.3.1,这个时候你首先先下好GDB的源码,然后进入到gdb_src/gdb/gdbserver目录下进行./conf

使用GDB在ARM上进行开发调试

一.安装GDB及GDB server 1.1 GDB简介 GDB调试环境由宿主机GDB和目标开发板的GDB server共同构成,两者通过串口或TCP连接.使用GDB标准串行协议协同工作,实现对目标机的系统内核和上层应用的监控和调试功能. GdbServer是GDB的一个组件,但通常不随发行版本的GDB一同发布,需要用户自行编译GDB的源代码包得到相应的GDB和GDBServer,可以从下载地址:http://ftp.gnu.org/gnu/gdb/,或者百度获取下载地址. 1.2 安装GDB

GDB(十)--调试正在运行的进程

我编写了一个循环: long i;    for (i = 0; i < 999999; i++) {        mt.a += 1;        sleep(1);    }把它编译成a.out,并在后台执行它:./a.out & [1] 2570 然后用命令gdb ./a.out 2570可以附加到这个进程上.被时进程会中断. 或者在GDB里输入attach 2570同样可以附加到进程. 输入bt来查看栈 (gdb) bt#0  0x008e9416 in __kernel_vsy

[编译器]dev c++单步调试

一.dev c++调试崩溃的解决方案 1.点击“工具 -> 编译选项”. 2.选择“编译器”选项卡,勾选“编译时加入以下命令”,输入“-g3”. 3.选择“代码生成/优化”选项卡,选择“连接器”选项卡,将“产生调试信息”选为“Yes”. 4.点击确定,重新编译需要调试的程序,就可以单步运行了. 二.单步调试 1.设置断点:在行号附近单击即可,如何调出行号,请转到文末. 2.单击“调试”按钮. 当然也可以在“运行”里找到: 这时界面是这样的: 蓝色的横行左侧带有一个蓝色的箭头,代表当前单步执行的位