应用程序调试工具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#.net对excel的操作——创建一个excel报表两个sheet就是2个表分别添加内容

    添加引用:Microsoft.Office.Interop.Excel //创建excel对象,就是实例化一个excel对象            Application excel=new Appl ...

  2. kali安装vmware tools

    昨天在网上搜了半天如何在kail下安装tools工具,结果都没有成功,今天就来说说我是怎么安装成功的. 1.按照网上的办法只能到这一步,一直提示找不到路径,点了回车也会照常出现这样的情况. Searc ...

  3. Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)

    Tomcat启动时报如下错误:     java.lang.OutOfMemoryError: PermGen space 解决办法:     配置相关内存大小.其中按照启动tomcat的不同方式,分 ...

  4. vb.net多线程

    Public Class Form1 Dim myThread As Threading.Thread Dim myThread2 As Threading.Thread Private Sub Bu ...

  5. FastReport报表控件使用技巧总结

    FastReport报表控件使用技巧总结 1.FastReport中如何访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject(' ...

  6. java web 学习 --第六天(Java三级考试)

    第五天学习在这:http://www.cnblogs.com/tobecrazy/p/3458592.html session对象 当某个用户首次访问web应用系统时,jsp会自动创建出一个sessi ...

  7. percona-toolkit 之 【pt-slave-delay】说明

    摘要: 在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从.比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或 ...

  8. FFmpeg for XP(x86) 2016-03-23 static 静态编译程序

    FFmpeg for XP(x86) 2016-03-23 static 静态编译适用于32位XP系统,能加的扩展都加了,结果文件大小非常大. 最新版加了不少视频和音频滤镜. ffmpeg.20160 ...

  9. jquery若干问题

    1.获取服务器端的控件 $("#<%=photopath.ClientID%>").uploadPreview({ Img: "ImgPr", Wi ...

  10. 在Debian上用Bind 配置DNS服务器

    1 什么是DNS 初学者可能不理解DNS到底是什么,干什么用.我是在1998年大学毕业时才听说这个词的.那时我在聊天室碰到潍坊信息港的一个网管,我恬不知耻地说我也是个网管,他说也维护DNS吗?我说,D ...