尽管目前使用的VS code可以使用插件一键构建和运行程序,但GDB作为调试利器,还是值得花时间去学习的。

概述

GDB(GNU Debugger) 是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。

参考: gdb调试利器

进入GDB环境调试

加载编译选项” –g”

以便在GDB调试环境中能够显示出具体的错误位置。

例:

g++ filename.cpp –g –o filename

在cmake编译中,可以通过可选项 -DCMAKE_VERBOSE_MAKEFILE=1 ,具体显示编译过程,保证-g选项在编译过程中使用。

加载可执行文件到GDB中

在执行文件所在文件夹里,使用 gdb 命令进入到GDB调试环境中。之后使用 file filename

或者使用 gdb filename (filename可执行文件名)。

对执行文件进行输入参数的设置

使用命令 set args parameter (parameter为输入的参数),加载运行所需的参数。通过 show args 查看加载参数的情况。

例:

set args /home/hello.png 2016 12

使用’show args’后:

/home/hello.png 2016 12

GDB内使用make

外部文件有修改的情况下,直接在GDB环境中使用“make”进行编译。

文件执行

使用 r 即可对文件进行执行。

退出GDB调试环境

使用 q 退出调试环境。

断点设置

断点设置的方法

  • 使用行号:b linenumber 例:“b 2017”
  • 使用函数名 b function 例:“b hello”
  • 使用地址 b *address 例:“b *0x404”

若在不同文件上打断点,在行号或函数名前加上文件名和冒号“filename:”。

例:

b hello.cpp:hello
b hello.cpp:2017

条件断点

在1小点方法后面加入条件,断点在条件成立时起停止作用。

例:

b 12 if x > y  // 在x > y情况下,断点起作用。

断点条件更改

将指定断点号的条件进行修改:

condition breakpointnumber expression

例:

condition 12 if x = y

condition breakpointnumber 停止使用条件,断点不受条件限制使用。

例:

condition 12

断点信息查看

  • 查看所有的断点信息: info b
  • 查看指定断点号断点信息: info b number

断点的使能

  • 停止该号断点。但未删除: dis breakpointnumber
  • 使能改号断点: enable breakpointnumber

调试的方式

打印变量 p

  • 打印变量值:p variable 例: “p x”
  • 打印变量地址:p &variable 例: “p &x”
  • 打印指针内容:p *point 例: “p *pData”

单步调试 s

类似于 step in

  • 单步执行,遇到函数,进入到函数内部执行。

    s number 进行多步执行

单步执行 n

类似 step over 执行,遇到函数,不进入函数内部,直接执行完函数。

n number 进行多步执行

继续执行 c

在程序在执行中遇到断点后,使用 c 继续执行

执行完当前函数并打印出信息 finish

在函数内部使用 finish ,执行完当前整个函数打印返回信息

设置变量值调试

set var variable = x 将变量设置为x后进行调试

例:

set var tmp = 5

将变量 tmp 设置为5,var关键词确保不产生冲突

段错误的查找

段回溯 bt

  • 在出现 segment fault 时,使用命令进行段错误的查看。
  • 可以得到错误坐在的函数。像得到某人家庭地址。
  • 也可使用 where

进入错误段

  • 在查看到错误的位置之后,使用 frame number 进入到该段内部。
  • 进入内部之后便可以进行局部变量的打印调试。

例:

frame 5

就进入到段5.

  • 切换到上一层段: up
  • 切换到下一层段: down

代码显示

  • 显示当前代码: l
  • 显示当前之前的代码: l -
  • 显示该行周围代码: l number
  • 显示该函数周围代码: l function (C++代码需要在函数名前加类名,重载函数需要在函数内加参数类型)
  • 显示指定文件指定行周围代码: l filename:linenumber

例:

l hello.cpp:1   // 从hello.cpp第一行开始显示
  • 显示指定文件指定函数周围代码: l filename:function

例:

l hello.cpp:Util::hello    // 显示hello.cpp文件下,Util类的函数hello
  • 显示起始终止行内代码: l fisrt,last

例:

l 1,30  // 从第0行显示到第30行的内容

关于GDB调试的相关文章:https://www.cnblogs.com/acceptedzhs/p/13161213.html

GDB调试基础使用方法的更多相关文章

  1. GDB调试基础

    GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...

  2. [转]GDB调试基础

    一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...

  3. gdb调试原理及qemu中的gdbserver

    (一)gdb调试原理 此部分转自:https://blog.csdn.net/u012658346/article/details/51159971     https://www.cnblogs.c ...

  4. 嵌入式 GDB调试死锁示例

    死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被 其他线程占用并堵塞了的资源.例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线 ...

  5. gdb调试段错误及使用

    在编程调试中,经常出现段错误,此时可用gdb调试.具体方法为注册段错误信号处理函数,在处理函数中启动gdb.具体代码如下: void segv_handler(int no) { ]; ]; FILE ...

  6. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  7. CodeBlocks(17.12) 代码调试基础方法&快捷方式

    转载:CodeBlocks(17.12) 代码调试基础方法&快捷方式: https://www.cnblogs.com/DCD112358/p/8998053.html

  8. 调试器GDB的基本使用方法

    GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited ...

  9. 《gdb调试之基础篇》

    <gdb调试之基础篇> http://blog.csdn.net/miss_acha/article/details/42346543

随机推荐

  1. Python练习题 021:递归方法求阶乘

    [Python练习题 021] 利用递归方法求5!. ---------------------------------------------- 首先得弄清楚:5! 指的是"5的阶乘&qu ...

  2. JS/TS 对数组中的对象按对象的值进行去重

    举个例子:对以下数组按 lastName 的值进行去重 let listData = [ { firstName: "Rick", lastName: "Sanchez& ...

  3. Windows10系统下wsappx占用CPU资源过高?wsappx是什么?如何关闭wsappx进程?

    在Windows10系统开机的时候,wsappx进程占用的CPU资源非常高,导致电脑运行速度缓慢,那么我们如何关闭wsappx进程,让电脑加快运行速度呢?下面就一起来看一下操作的方法吧. [现象] 1 ...

  4. Fabric1.4.4 基础环境搭建

    简单记录一下fabric版本1.4.4的环境搭建部署,运行环境为CentOs7.8,如有错误欢迎批评指正. 1.Docker 和 Docker Compose 1. docker的安装部署 docke ...

  5. Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)

    一,问题 app自动化测试使用Android真机连接电脑时,通常会遇到两种情况: 1.测试机连接电脑会弹窗提示USB选项,选择USB用于"传输文件",有些手机不支持设置默认USB选 ...

  6. pytest文档51-内置fixture之cache使用

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

  7. 基于python实现单链表代码

    1 """ 2 linklist.py 3 单链表的构建与功能操作 4 重点代码 5 """ 6 7 class Node: 8 " ...

  8. Android Jetpack从入门到精通(深度好文,值得收藏)

    前言 即学即用Android Jetpack系列Blog的目的是通过学习Android Jetpack完成一个简单的Demo,本文是即学即用Android Jetpack系列Blog的第一篇. 记得去 ...

  9. centos8平台使用strace跟踪系统调用

    一,strace的用途 strace  是最常用的跟踪进程系统调用的工具. 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectfore ...

  10. 第五章 Linux操作系统关机、重启、注销及其查看ip命令

    一.更新系统时间与网络时间同步 1.  安装ntpdate工具 # yum -y install ntp ntpdate 2.  设置系统时间与网络时间同步 # ntpdate cn.pool.ntp ...