Linux 调试器 --- g d b 使用

目录


一:gdb简介

二:示例代码

三:使用

1.启动gdb

2.各种指令

<1>: 查看源代码 

<2>:设置断点

<3>:查看断点信息

<4>:删除断点

<5>: run 

<6>:逐过程调试

<7>:逐语句调试

<8>:查看变量值

<9>:跳转行号

四:总结


一:gdb简介

        GDB 全称“GNUsymbolic debugger”,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go 等等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 在某个指定的地方或条件下暂停程序。 当程序被停住时,可以检查此时你的程序中所发生的事。 在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。

二:示例代码

code.c 文件内容为:

#include<stdio.h>
int ADDToTop(int num)
{int result = 0;int i = 0;for(i = 1; i <= num; i++){result += i;}return result;
}
int main()
{int num = 10;int sum = 0;sum = ADDToTop(num);printf("sum: %d\n",sum);return 0;
}

makefile 文件内容为:

mycode:code.cgcc -o $@ $^ -g
.PHONY:clean
clean:rm -f mycode

我们知道程序的发布形式,有两种,一种为 debug 模式,另一种为 release 模式。一般情况下,编译指令为: gcc code.c -o test ,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。不加就是默认为 release 版本。

编译为 debug 版本的指令为:

gcc code.c -o code.debug -g -std=c99

debug版本需要一些调试信息,占用的内存更大,所以我们可以通过占用内存的大小,判断Linux gcc/g++出来的二进制程序,默认是哪一种模式?

89a4768a9a4b47ffad37919f0b666b51.png

通过上述示例,我们可以看出,Linux gcc/g++出来的二进制程序,默认是release模式。

5dc4d7cde85a4bbdafdc105b16f114d6.png

-std = c99 ,c99 是C语言的一个标准,该标准规定了可以在循环控制条件里面定义变量,(eg:for(int i = 0; i < 10; i++)。如果没有使用,则可能会导致:

683e2b8658164be5ae41d1ae7f1242d9.png

三:使用

1.启动gdb

启动 gdb 的指令为 [gdb + 文件的名称] 示例:

gdb mycode

运行效果为:

b1f0998dc3da4841ba2554db0be1eccf.png

此时,需要我们切换为 root 用户,安装 gdb ,如下图所示:

b752e8df1b0f4b75bd46a7fca6edc3bd.png

此时,我们再切回普通用户,进行启动 gdb 的工作:

63122376969344bb9d0e6f02c52d6194.png

73a03a26f95e4390a61991da8581bb74.png

如果出现上述界面,则说明已经进入 gdb 调试,接下来可以开始使用各种指令进行调试。

2.各种指令

在进行各种调试指令之前,我们需要首先知道退出调试的指令:

ctrl + d 或 quit 调试命令

<1>: 查看源代码 

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

ddfeb7f86d034c048b3c90898a8e0dea.png

<2>:设置断点

break(b) 行号:在某一行设置断点

我们此处在以 #include<stdio.h> 为第一行的第16行打上断点: 

058377009557425281a31ab0e4d8954a.png

break 函数名:在某个函数开头设置断点

在 main 函数,和 ADDToTop函数开头打断点 

5438d82629ff4b1290b456ff5278515b.png

<3>:查看断点信息

info break :查看断点信息

我们查看在 <2> 第16行所打的断点:

a43a8251d0be4d5082c8bd25e28f07ec.png

Num --- 编号   Type --- 种类   Address --- 断点在内存中的位置  What --- 断点在程序中的位置

查看 <2> 中指定函数名打断点:

6fac154aa6fc4ad7a9c7418986c305c1.png

<4>:删除断点

delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点

n --- 表示该断点不可用,y --- 表示该断点可用

3bccfa7e94a54e888c8581542bb36e04.png 如果想把已经变为 n 的改变为 y ,则需要执行:enable b 3 命令,示例:

dffc3c929339428b9c9cdd57fedb4522.png

<5>: run 

run(或r):从开始连续而非单步执行程序
如果有断点,则执行到断点处停止,如果没有断点,则执行到结束。

c8ae98f5eef74505aa12a14c0b2a210d.png

d69fa615ed6d4b1a8bd6eb3c7e28beb3.png

<6>:逐过程调试

n 或 next:单条执行。一步步执行,但不会进入函数内部

清空原来的所有断点,在第16行打上断点,按下 r  运行键,程序会在断点处停下,此时输入 n,观察现象:

 程序直接执行完了 ADDToTop 函数内部的全部内容。

<7>:逐语句调试

s或step:进入函数调用,遇到函数时,会进入函数内调试

 保持第16行的断点,按下 r 执行到断点处停止,此时在按下 s ,观察现象:

我们发现逐语句调试过程中,进入了 ADDToTop 函数内部,并且一步一步往下执行。

<8>:查看变量值

p 变量:打印变量值。

 可以用于查看循环执行到某一步的时候,查看某个/某些变量的值,如下图所示:

<9>:跳转行号

until X行号:跳至X行

当我们进入一个函数后,可能会存在需要循环很多次的场景,此时,我们可以通过 until 行号 跳转到指定行数,示例如下:

 

四:总结


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TrustZone​之在安全状态之间切换

如果处理器处于NS.EL1,而软件想要转移到S.EL1,应该如何实现呢? 要改变安全状态,无论是向上还是向下,执行都必须经过EL3,如下图所示: 前面的图表显示了在不同安全状态之间移动涉及的步骤的示例序列。逐步进行解释: 进入较高的异常级别需要一个异常。通常,此异常…

【JavaWeb】项目后端部分统一解决方案

项目后端部分统一解决方案 文章目录 项目后端部分统一解决方案一、异步响应规范格式类二、MD5加密工具类三、JwtHelper工具类四、CrosFilter过滤器 一、异步响应规范格式类 Result类 package com.pro.common;/*** 全局统一返回结果类**/ public class Result<T> {// 返…

HTML可以使用属性访问AJAX、CSS过渡、WebSocket和服务器发送事件?

最近发现一个有意思的开源库&#xff1a;Htmx 在 GitHub 的描述中: htmx 被称为“允许您直接在HTML中使用属性访问AJAX、CSS过渡、WebSocket和服务器发送事件&#xff0c;以便您可以以超文本的简洁和强大之处构建现代用户界面”。 什么是htmx&#xff1f; 简而言之&#xff0c…

相关基础知识

本文引注&#xff1a; https://zhuanlan.zhihu.com/p/447221519 1.方差 2.自协方差矩阵 3.自相关矩阵 4.互协方差矩阵 5.互相关矩阵 6.相关系数 7.自相关函数、自协方差函数与功率谱密度 8.互相关函数、互协方差函数与互功率谱密度

强大JavaScript 技巧

浏览器 01、实现全屏 当您需要将当前屏幕显示为全屏时 function fullScreen() { const el document.documentElement const rfs el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen i…

时间选择器

<el-form-item label"时间范围"><!-- <el-date-picker size"small"v-model"createTime"type"daterange"range-separator"至"start-placeholder"请输入起始创建时间"end-placeholder"请输入终止创…

前端常见手写代码题集

1. 手写Object.create 思路&#xff1a;将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }2. 手写 instanceof 思路&#xff1a;不断地从左边的原型链上去找 function MyInstanceof(left, right) {let l Object.getPrototype…

无线网优AP、SW发现控制器

目录 无线网优解决的问题 1、信号覆盖不足的原因 2、信道繁忙 3、非802.11干扰 4、协商速率低 5、漫游效果差 6、有线带宽阻塞 无线网优方法 交换机发现与激活 一&#xff0c;交换机发现控制器方式 1、二层广播 2、DHCP option43方式 3、DNS域名解析方式 4、trou…

Springboot之整合Swagger3

依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 application.yaml spring:# mvc这部分解决swagger3在新版本Springboot中无…

C++模板基础及代码实战

C模板基础及代码实战 C 模板概览 泛型编程的支持 C 不仅为面向对象编程提供了语言支持&#xff0c;还支持泛型编程。正如第6章《设计可重用性》中讨论的&#xff0c;泛型编程的目标是编写可重用的代码。C 中支持泛型编程的基本工具是模板。虽然模板不严格是面向对象的特性&a…

C/C++---------------LeetCode第350. 两个数组的交集 II

两个数组的交集|| 题目及要求双指针哈希表在main内使用 题目及要求 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0…

基于springboot + vue大学生竞赛管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

基于单片机的智能健康监测手环的设计

目 录 1 绪论... 2 1.1 引言... 2 1.2 智能手环的国内外研究现状... 2 1.3 课题的研究意义... 3 1.4 本文的研究内容和章节安排... 4 2 智能手环系统设计方案... 5 2.1 系统总体设计方案... 5 2.2 主芯片选择... 5 2.3 显示方案的选择... 6 2.4 倾角传感器的选择... 6 2.5 心率…

【AIGC】AI作图最全提示词prompt集合(收藏级)

目录 一、正向和负向提示词 二、作图参数 你好&#xff0c;我是giszz. AI做图真是太爽了&#xff0c;解放生产力&#xff0c;发展生产力。 但是&#xff0c;你是不是也总疑惑&#xff0c;为什么别人的图&#xff0c;表现力那么丰富呢&#xff0c;而且指哪打哪&#xff0c;要…

DFT(离散傅里叶变换)的通俗理解

本文包含了博主对离散傅里叶变换&#xff0c;负频率&#xff0c;实信号与复信号频谱的理解&#xff0c;如有不妥&#xff0c;欢迎各位批评指正与讨论。 文章目录 DFT的理解信号的频谱实信号的频谱复信号的频谱 DFT的理解 傅里叶变换是一种将信号从时域转换到频域的数学工具。…

SQL Server事务(Transaction)

5. 事务(Transaction) 5.1. 事务概念 事务是关系库中不可分割的一系列数据库操作,这些操作必须要么整体成功,要么整体失败。事务维护数据完整性,保证数据库总是处于一致性状态。虽然,各关系库中事务实现和操作的具体细节有所不同,但基本概念和功能完全相同,而具体操作…

通信标准化协会,信通院及量子信息网络产业联盟调研玻色量子,共绘实用化量子未来!

8月14日&#xff0c;中国通信标准化协会&#xff0c;信通院标准所及量子信息网络产业联盟等单位领导走访调研北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;&#xff0c;参观了玻色量子公司及自建的十万颗粒洁净度的光量子信息技术实验室&#x1f517;…

【win32_003】不同字符集下的通用字符串语法TCHAR、TEXT、PTSTR、PCTSTR

TCHAR 通用 根据项目属性是否使用Unicode字符集&#xff0c;TCHAR被解释为CHAR(char)或WCHAR(wchar_t)数据类型。 TCHAR a ‘A’ ; TCHAR arr [] TEXT(“AA”); TCHAR arr [100] TEXT(“AA”); TCHAR *pstr TEXT(“AA”); TEXT宏 #ifdef UNICODE #define __TEXT(quote) L#…

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…

10年前,我就用 SQL注入方式发现了学校网站的漏洞

大家好&#xff0c;我是风筝。 事情是这样子的&#xff0c;在10年以前&#xff0c;某个月黑风高夜的夜里&#xff0c;虽然这么说有点暴露年龄了&#xff0c;但无所谓&#xff0c;毕竟我也才18而已。我打开电脑&#xff0c;在浏览器中输入我们高中学校的网址&#xff0c;页面很…