对于gdb是什么,这里就不多说了,只要是程序员一般都听说过,像java开发会用到集成开发工具eclipse,里面调试起来非常方便,全是可视化的,但是如果在linux下编写的c程序,用可视化的调试就没这么方便了,这时就得用gdb了,当程序比较大时,在开发肯定会出现很多bug,对于怎么调试这些bug就显得非常重要了,所以下面来详细的学习这一调试工具,进入正题:

gdb功能:
 
下面来调试一个简单例子来对gdb有个感性的认识,之后再一一来学习:
先来编译运行一下该程序:
【注意】:用gdb调试时,需要加上-g参数,以便生成调试信息。
 下面开启调试一下:
下面来查看一下源代码:list
也可以用l缩写:
【注意】:在gdb中所有的命令都可以用首字母进行缩写。
 以上查看源代码敲一个命令只能查看到一部分,所以要想查看剩余的代码,直接敲回车键既可:
下面来给代码打断点:
给某一行代码打断点:
给一个函数打断点:
那怎么查看指定行的代码断呢?
接下来,咱们运行调试,目前打了两个段点,一个是10行,一个是24行,运行时应该就会停在断点处:
下面单步执行:
如果想查看一下某变量的值可以这样:
如果想跳出一个循环,可以敲入如下命令:
如果想执行运行到下一个断点处,可以这样做:
下面接着运行,如果想退出函数返回到主干继续执行的话,可以这样:
下面继续运行则程序就结束了:
 
通过这个例子,就能感性地认识到gdb的调试流程了。下面则来详细的一一进行介绍:
运行程序:
这个比较简单,在上个实验中已经看到了,就是运行gdb调试
在运行gdb调试时,可以传一些参数,先修改一下原程序,为了看到其效果:
simple:c:
#include <stdio.h>
#include <stdlib.h> long func(int n); int main(int argc, char *argv[])
{
printf("Entering main ...\n");
int i;
for (i=0; i<argc; ++i)
{
printf("%s ", argv[i]);
}
printf("\n");//将传过来的参数打印出来
long result = ;
for (i=; i<=; ++i)
{
result += i;
}
printf("result[1-100] = %ld\n", result);
printf("result[1-10] = %ld\n", func()); printf("Exiting main ...\n");
return ;
} long func(int n)
{
long sum = ;
int i;
for (i=; i<=n; ++i)
{
sum += i;
} return sum;
}

这时编译并运行看下效果,这次不用gcc单独来敲了,而直接用make,因为已经编写好了Makefile:

查看源码:
下面为了更好看到效果,用一个多文件的程序来进行说明:
main.c:
#include <stdio.h>
#include "search.h" int main(int argc, char *argv[])
{
printf("Entering main ...\n");
int i;
for (i=; i<argc; i++)
{
printf("%s ",argv[i]);
}
printf("\n");
int a[] = {, , , , , , , , , };
int key = ;
int pos;
int count = ; pos = ;
while ((pos=seq_search(a, pos, 10, key)) != -)
{
count++;
pos++;
} printf("%d occurs %d times in the list\n", key, count);
printf("Exiting main ...\n");
return ;
}
search.h:
#ifndef _SEARCH_H_
#define _SERACH_H_ int seq_search(int list[], int start, int n, int key); #endif // _SERACH_H_
search.c:
#include "search.h"

int seq_search(int list[], int start, int n, int key)
{
int i;
for (i=start; i<n; ++i)
{
if (list[i] == key)
return i;
} return -;
}

其中main.c中的seq_search函数的实现是在search.c文件中。

 
如果代码查看了,那怎么重新查看呢?
 
 
 
 如果我想查看seq_search函数的原代码,由于它在search.c文件中,那就可以利用这种方式查看:
如果有多个文件中有seq_search同名的函数,那可以跟上文件名:
设置断点与观察点:
 
 
 
 
下面以第一个例子来说明:
 
 
 
 
下面从新开始打断点,为了好说明:
 
 
下面请瞪大眼睛看:
 
这个就不用多说了,比较容易理解。 
 

单步调试:
这个已经在上面实验中使用过了,在实际开发中也经常用,这里就不多说了。
 
 
 
 
 
 
这个上面已经使用到了,这里就不演示了
 
 
 
最后再来总结一下gdb调试的命令:
关于gdb的学习先学到这,纯操作,没有什么难点,但实际工作中应该都会用到,需好好操练下,下节见~

gdb调试(一)的更多相关文章

  1. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  2. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  3. gdb调试器的使用

    想要使用gdb调试程序的话,首先需要gcc -g main.c -o test 然后运行gdb test对程序进行调试 l (小写的l,是list的首字母),用以列出程序 回车    是运行上一个命令 ...

  4. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  5. gdb调试PHP扩展错误

    有时候,使用PHP的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉linux下C编程的肯定不陌生gdb 首先,使用ulimit -c命令,查 ...

  6. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  7. gdb调试

    ·代码(实验楼中的代码,改了部分数值)命名为test.c int g(int x) { return x + 7; } int f(int x) { return g(x); } int main(v ...

  8. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  9. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

  10. 赵文豪 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...

随机推荐

  1. QT5.10+MinGW+OpenCV3.4.2编译

    一.准备工作: (1)在OpenCV官网下载3.4.2版本(注意选择Win pack),https://opencv.org/releases.html. (2)下载Contrib模块,https:/ ...

  2. Influx Sql系列教程二:retention policy 保存策略

    retention policy这个东西相比较于传统的关系型数据库(比如mysql)而言,是一个比较新的东西,在将表之前,有必要来看一下保存策略有什么用,以及可以怎么用 I. 基本操作 1. 创建re ...

  3. 在ensp上STP配置和选路规则

    原理概述 这次我们模拟的实验内容 搭建实验拓扑 搭建完拓扑之后,我们在交换机上启动STP服务,将交换机的STP模式改为普通生成树STP 配置完成之后我们来看一下S1生成树的状态(大约30秒之后,因为生 ...

  4. QT -- QString处理

    1. 去掉字符串多余的空格,回车等. QString QString::simplified () const Returns a string that has whitespace removed ...

  5. LeetCode 537. 复数乘法(Complex Number Multiplication)

    537. 复数乘法 537. Complex Number Multiplication 题目描述 Given two strings representing two complex numbers ...

  6. controller进行数据保存以及作用域

    controller进行数据保存以及作用域 一.request域 1.ModelAndView 在ModelAndView中进行存键值对,也可以进行跳转的地址存储,但是返回类型必须是ModelAndV ...

  7. 【C++札记】拷贝构造函数,浅拷贝和深拷贝

    一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...

  8. pycharm django使用技巧

  9. Asp.net Core CORS 跨域

    本文主要介绍在Asp.net Core采用CORS方式解决跨域 关于跨域的原理介绍可参考Asp.net Web API 解决跨域详解 1 在Startup添加允许跨域的策略 services.AddC ...

  10. 【LEETCODE】38、167题,Two Sum II - Input array is sorted

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...