对于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. 并行编程架构(指令流水、进程、线程、多核,Pipe and Filter)

    最近在进行DSP软件优化时,查阅文献,看到了几种并行机制,下面予以总结: 关键词一:指令流水 关键词二:多进程 关键词三:多线程 关键词四:多核(多处理器.超线程结构.多核结构.多核超线程架构) 在体 ...

  2. Dubbo服务器与普通服务器的区别

    Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 1.什么是分布式服务框架 分布式有两个特点,分别是内聚性和透明性(比如 ...

  3. linux线程间同步方式总结梳理

    线程间一般无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时使用.只是要注意的是线程间须要做好同步! 使用多线程的理由: 1. 一个是和进程相比,它是一种非常&q ...

  4. tensorboard 拒绝访问解决方法

    打开Anaconda Prompt,切换到TensorFlow环境(activate tensorflow) 切换成功之后,输入tensorboard --logdir='路径' 注意:--logdi ...

  5. 17 IO流(十四)——Print流

    PrintStream流 PrintStream作为一个包装流,它可以包装字节流,甚至可以使用指定的文件创建一个打印流.它的构造函数很丰富,建议打开API看一下. 它常用的方法是print方法与pri ...

  6. ArcGIS Server SOE地图服务重启特别卡

    ArcGIS Server 服务器端扩展,SOE代码调试时,需要经常重新编译.替换地图服务中的扩展, 由于未知问题,本地开发环境包含SOE的地图服务,每次重启都需要耗费相当长的时间,大体上20多分钟, ...

  7. redis连接相关命令

    命令名称:echo 语法:echo message 功能: 打印一个特定的信息message,测试时使用. 返回值: message自身 命令名称:ping 语法:ping 功能: 使用客户端向red ...

  8. IDENTITY、SCOPE_IDENTITY、IDENT_CURRENT的分析

    https://www.cnblogs.com/daihuiquan/archive/2013/03/18/2956845.html IDENT_CURRENT.IDENTITY.SCOPE_IDEN ...

  9. 并发编程之Callable异步,Future模式

    Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口.然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果.我们一般只能采用共享变 ...

  10. git下,输入git log 进入log 怎么退出

    解决方案: 英文状态下按Q就可以了 ctrl + c (应该是Linux命令中断的意思,很多中断都是这个命令). Paste_Image.png