应用程序调试工具gdb学习使用

一、GDB简介

GDB 是 GNU 发布的一款功能强大的程序调试工具。GDB 主要完成下面三个方面的功能:

  1、启动被调试程序。
  2、让被调试的程序在指定的位置停住。
  3、当程序被停住时,可以检查程序状态(如变量值)。

1.1gdb使用流程

1.编译生成可执行文件:

  gcc –g tst.c -o tst
2.启动 GDB
  gdb tst(文件名)
3. 在 main 函数处设置断点
  break main
4. 运行程序
  run
5. 利用更加丰富的 gdb 命令对程序进行调试。

1.2gdb命令

1.list(l) 查看程序

2.break(b) 函数名 在某函数入口处添加断点

3.break(b) 行号 在指定行添加断点

4.break(b) 文件名:行号 在指定文件的指定行添加断点

5. info break 查看所有设置的断点

6. delete 断点编号删除断点

7.next(n) 单步运行程序(不进入子函数)

8.step(s) 单步运行程序(进入子函数)

9.continue(c) 继续运行程序知道下一个断电

10.print(p) 变量名 查看指定变量值

11. set var=value 设置变量的值

12.quit(q) 退出 gdb

二、使用Coredump解决Segment fault(段错误)

  有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的.但这不像编译错误一样会提示到文件->行,而是没有任何信息, 使得我们的调试变得困难起来.

  有一种办法是, 我们用gdb的step, 一步一步寻找.这放在短小的代码中是可行的。但如果程序代码数量比较庞大,我们就得使用另一种办法了。这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump。

2.1 Core Dump要解决的问题---->段错误 Segment fault

  Linux应用程序在运行过程中,经常会遇到Segment fault(段错误) 这样的错误。产生这样错误的原因通常有:

  1. 数组访问越界

  2. 访问空指针

  3. 栈溢出

  4. 修改只读内存

2.2  Core Dump-使能

在Linux系统中,默认是关闭core dump功能的,但是可以通过来ulimit命令打开/关闭core dump功能。

打开:ulimit  -c  unlimited

关闭:ulimit  -c  0

2.3  core文件分析

发生core dump之后, 可以使用gdb进行查看core文件的内容, 以定位程序出错的位置.

用法:gdb  程序名  core文件名

例: gdb ./test core.12551

   在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

2.4使用GDB+Core+file找出程序中的错误

应用程序调试工具gdb,王明学learn的更多相关文章

  1. linux应用程序地址布局,王明学learn

    linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...

  2. C实战:强大的程序调试工具GDB

    C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...

  3. 管道通信,王明学learn

    管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4. ...

  4. 进程控制理论,王明学learn

    进程控制理论 一.进程 进程是一个具有一定独立功能程序的一次运行活动. 1.1进程特点 1.动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的 2.并发性:任何进程都可以同其他进程一起 ...

  5. 库函数系统调用文件方式,王明学learn

    库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...

  6. 静态/动态函数库设计,王明学learn

    静态/动态函数库设计 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供. 两者区别: 一.函数库分类 函数库按照链接方式可分为: 1.静态链接库 对函数库的链接是放在编译时期(com ...

  7. 协处理器,王明学learn

    协处理器 协处理器用于执行特定的处理任务,如:数学协处理器可以控制数字处理,以减轻处理器的负担.ARM可支持多达16个协处理器,其中CP15是最重要的一个. CP15提供16组寄存器 通过提供的16组 ...

  8. ARM伪指令,王明学learn

    ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...

  9. ARM指令学习,王明学learn

    ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令    2.— MVN 数据取反传送指令    3.— CMP 比较指令    4.— CMN 反值比较指令    5.— TST 位测试 ...

随机推荐

  1. C# 复制(深拷贝、浅拷贝)

    Object.MemberwiseClone 方法 创建当前 Object 的浅表副本. protected Object MemberwiseClone() MemberwiseClone 方法创建 ...

  2. 如何在maven中添加本地jar包

    mvn install:install-file -DgroupId=mytest-DartifactId=test-Dversion=1.1 -Dpackaging=jar -Dfile=d:\te ...

  3. /etc/securetty文件

    /etc/securetty 文件允许你规定“root”用户可以从哪个tty设备登录. 登录程序(通常是/bin/login)需要读取“/etc/securetty”文件. 它的格式:列出来的tty设 ...

  4. 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查

    1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...

  5. google 语音api

    mdeia.Source = new Uri("http://translate.google.cn/translate_tts?ie=UTF-8&q=你好&tl=zh-CN ...

  6. vs版本转换工具

      [转]C#写的工程项目移植转换工具 – 支持VS2005/VS2010/VS2012/VS2013 经常用Visual Studio开发项目的是不是会经常遇到下面这种情况或者类似于这样的情况?用新 ...

  7. C#传真传址 结构体

    1.传真  传址 namespace 传值_传址 { class Program { //格式1:无参无返 public void LeiJia() { Console.Write("请输入 ...

  8. 穹举,迭代,while循环。

    所有循环  必要条件 :   初始条件(注意初始条件的位置)   循环条件   循环体   状态改变: 1.穷举 将所有可能性全部全部走一遍,使用IF筛选出满足的情况 使用循环语句    for   ...

  9. JAVA导出pdf实例

    一.直接导出成PDF   Java代码 1. import java.io.FileNotFoundException; 2. import java.io.FileOutputStream; 3.  ...

  10. python数据库(mysql)操作

    http://fantefei.blog.51cto.com/2229719/1282443