文章目录

  • 一、背景
  • 二、gdb的指令与使用
    • 1.gdb的基本指令。
    • 2.gdb指令的简单使用
      • 1.进入gdb模式
      • 2.实例说明
  • 三、调试coredump文件
    • 前提:本质上是在调试程序崩溃之后的内存镜像文件。
    • 内存镜像文件保存的是,程序在崩溃的一瞬间内存当中的值

一、背景

  • 程序的发布方式有两种,debug和release模式,要在linux中调试,需要使用到一个工具——gdb调试器。
  • gdb调试器类似于VS中的debug模式。
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用debug模式,必须在源代码生成二进制程序的时候,加上-g选项

二、gdb的指令与使用

1.gdb的基本指令。

首先列举下gdb调试器的基本指令。

  1. list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  2. list/l 函数名:列出某个函数的源代码。
  3. r或run:运行程序。
  4. n 或 next:单条执行。
  5. s或step:进入函数调用。
  6. break(b)行号:在某一行设置断点。
  7. break 函数名:在某个函数开头设置断点。
  8. info break :查看断点信息。
  9. finish:执行到当前函数返回,然后停下来等待命令。
  10. print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数 。
  11. p变量:打印变量值。
  12. set var:修改变量的值。
  13. continue(或c):从当前位置开始连续而非单步执行程序。
  14. run(或r):从开始连续而非单步执行程序。
  15. delete breakpoints:删除所有断点。
  16. delete breakpoints n:删除序号为n的断点。
  17. disable breakpoints:禁用断点。
  18. enable breakpoints:启用断点。
  19. info(或i) breakpoints:参看当前设置了哪些断点。
  20. display 变量名:跟踪查看一个变量,每次停下来都显示它的值。
  21. undisplay:取消对先前设置的那些变量的跟踪。
  22. until X行号:跳至X行 。
  23. breaktrace(或bt):查看各级函数调用及参数。
  24. info(i) locals:查看当前栈帧局部变量的值。
  25. quit / ctrl+d:退出gdb。

2.gdb指令的简单使用

前面介绍了gdb调试器的一些指令,现在选一些指令实际应用一下。

1.进入gdb模式

1. vim一个简单的sum.c文件:

2. 使用gcc -g指令,生成可以gdb的文件:

3. gdb + 文件名,进入调试模式:

2.实例说明

出现如上界面,表示已经进入了gdb模式,接下来介绍几个gdb下的指令的使用。

  1. list/l 行号:输入l+行号则跳到输入行号的位置,只输入l则从第一行开始显示十行内容,在输入l会跳转到后面十行,如图。

  2. list/l 函数名:列出某个函数名,以sum.c的sum函数为例。输入l sum

  3. r或run:运行程序。 输入 r,可以看到输出了打印结果:11

  4. break/b 行号:在某一行设置断点,例如现在在12,13,14行分别设置断点,设置成功会有提示,并给出断点序号Breakpoint n。

  5. info break(i b):查看断点信息,输入info break,可以看到断点信息,地址和所在行号。

  6. disable 断点的序号:使断点失效


可以看到,使断点1,2失效后,执行程序直接跳到了断点3处。
7. enable 断点的序号:使断点生效
8. delete breakpoints:删除所有断点
9. delete breakpoints n:删除序号为n的断点,删除断点1后,执行i b,断点1消失。

  1. n或next:单条执行,相当于windows中的逐过程执行,VS中的F10(需要先run)
    单条执行,不进入函数内部

  2. s或step:进入函数调用,相当于windows中的逐语句执行,VS中的F11(需要先run)

    执行s后,进入了函数sum内部并逐语句执行。

  3. continue©:从当前位置开始连续而非单步执行程序(遇到下一个断点时就会停止运行)

  4. print(p):打印变量的值
    ,首先执行到int a后,执行p a,显示a的值为5

三、调试coredump文件

前提:本质上是在调试程序崩溃之后的内存镜像文件。

产生coredump文件的条件:
1.linux操作系统当中,需要设置core size的大小,使用指令 ulimit -c size,如:
,可执行该语句将core size大小设置为无穷,这样当调试程序崩溃后,就会生成内存镜像文件
2.磁盘大小足够

内存镜像文件保存的是,程序在崩溃的一瞬间内存当中的值

执行gdb [可执行程序][coredump文件],可查看coredump文件的信息,获悉是什么地方发生了错误。
举个例子:
,首先创建一个明显有空指针赋值的错误文件。然后gcc编译并添加-g。

编译完成后,执行编译后的文件testfault,可以发现显示了段错误(吐核)的错误,这个错误就是内存访问越界或者空指针引起的。ls查看列表文件

出现了core.20390的文件 gdb进入,
主要的信息在倒数几行。program terminated with signal 11,Segmentaion fault表示程序收到了11号信号,产生了段错误。

圈出来的地方表示,崩溃的代码出现在testfault.c文件的第七行。
还可以通过:
1. bt:查看调用堆栈
2.f[堆栈序号]:跳转到某一个具体的堆栈

可以看到执行bt后,调用堆栈的信息列出,执行f 0跳到堆栈处,看到错误行。

tips:

  1. 11信号:解引用空指针,解引用野指针,越界访问内存
  2. 6号信号:double free

Linux调试——gdb调试器的简单使用调试coredump文件相关推荐

  1. 通过dlv简单分析Go coredump文件

    文章目录 dlv调试工具安装 调试Go程序core dump文件 Linux环境配置 Go环境配置 测试用例 总结 dlv调试工具安装 Github地址:https://github.com/go-d ...

  2. gdb 提示 coredump 文件 truncated 问题排查

    本文选自"字节跳动基础架构实践"系列文章. "字节跳动基础架构实践"系列文章是由字节跳动基础架构部门各技术团队及专家倾力打造的技术干货内容,和大家分享团队在基础 ...

  3. linux卸载gdb命令,【Linux学习】GDB调试器基本命令必知必会(一)

    本文介绍Linux下GDB调试器常用的基本命令. 测试均在Ubuntu12.10下完成. 先看看GDB调试的效果图: 对应的源代码: //插入排序,GDB调试测试代码 #include int x[1 ...

  4. gdb的简单使用和gdb+gdbserver方式进行ARM程序调试

    gdb的简单使用 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB ...

  5. Linux下的程序调试——GDB

    无论是多么优秀的程序员,都难以保证自己在编写代码时不会出现任何错误,因此调试是软件开发过程中的一个必不可少的 组成部分.当程序完成编译之后,它很可能无法正常运行,或者会彻底崩溃,或者不能实现预期的功能 ...

  6. linux下gdb单步调试

    用 GDB调试程序 GDB 概述 ---- GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 IDE的调试,但如果你是在 ...

  7. Linux系统gdb工具使用,使用 GDB 工具调试 Go

    排除应用程序故障是比较复杂的,特别是处理像 Go 这样的高并发语言.它更容易在具体位置使用 print 打印语句来确定程序状态,但是这个方法很难根据条件发展去动态响应你的代码. 调试器提供了一个强大得 ...

  8. linux的gdb远程调试,嵌入式Linux的GDB远程调试如何实现呢?

    有道启新嵌入式研究院--远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接.使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能.调试s ...

  9. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

最新文章

  1. pycharm中显示额外的“figure”窗口
  2. 虚拟机安装以及PCL的配置(1)
  3. 步步为营-11-ListT泛型的简单练习
  4. 【转】ABP源码分析三十八: ABP.Web.Api.OData
  5. 计蒜客NOIP2017提高组模拟赛(四)day1
  6. 免费在线文本分析工具
  7. 关于禅道项目管理软件
  8. 谈谈优化JDBC数据库编程(转)
  9. imx6ull开发板
  10. chm文件打不开的解决办法
  11. 好消息!Android 模拟器可以运行 ARM 应用了
  12. 如何充分利用Composition API对Vue3项目进行代码抽离
  13. 关于高德地图setCity()方法失效的NNNNNNN坑
  14. EventBus Vuex?
  15. 用matlab做随机实验1
  16. $watch和watch属性的使用
  17. android 点击查看大图_你是不是遇到,在花瓣网部分图片详情页,点击“放大镜”无法预览高清大图?...
  18. linux exp 导出数据库命令,linux exp 导出数据库
  19. mysql连接oracle视图_oracle数据库视图
  20. 第6章 关系数据理论 习题6

热门文章

  1. 光源时间_背光源缩短寿命的原因
  2. linux~mysql安装、卸载及使用命令
  3. 机器学习笔记:Transformer
  4. 文巾解题 1046. 最后一块石头的重量
  5. MySQL从入门到精通50讲(十)-MySQL中null值如何处理
  6. tableau可视化数据分析60讲(七)-工作表操作(长篇干货建议收藏!)
  7. 支持向量机SVM原理
  8. java 获取页面元素的位置_Selenium Java 页面元素定位2
  9. 深度学习100例-生成对抗网络(DCGAN)手写数字生成 | 第19天
  10. 【机器学习PAI实践三】雾霾成因分析