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.c
		gcc -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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试学习day7

文章目录 靶机&#xff1a;VaccineTask1Task2Task3Task4Task5Task6 7-9解题过程Task7Submit user flagSubmit root flag 靶机&#xff1a;Vaccine Task1 问题&#xff1a;除了SSH和HTTP&#xff0c;这个盒子上还托管了什么服务&#xff1f; ftpnmap扫一下 Task2 问题&…

typescript中的策略模式

typescript中的策略模式 当我们需要以整洁、易于维护和易于调试的方式构建应用程序时&#xff0c;使用设计模式是一种非常好的方式。 在本文中&#xff0c;我们的目标是阐明如何将策略模式无缝地集成到我们的应用程序中。如果我们熟悉依赖性注入&#xff0c;可能会发现策略模…

高防IP是什么? 防护CC 对抗DDOS

什么是DDoS高防IP&#xff1f; DDoS&#xff08;分布式拒绝服务&#xff09;攻击是指攻击者通过利用大量恶意流量向目标服务器发送请求&#xff0c;导致目标服务器无法正常处理合法用户的请求。DDoS高防IP是一种通过技术手段来应对DDoS攻击的解决方案。它能够过滤掉恶意流量&a…

DHCP Host Name

文章目录 前言DHCP OptionOption (12) Host Namednsmasq 前言 打开路由器页面&#xff0c;看到下面连接的设备&#xff0c;有的显示设备名称 Tmall-Genie、ESP-C37CE8&#xff0c;而有的直接显示 MAC 地址 D2:B0:XX:XX:XX:XX。 这个名称是哪里来的呢&#xff1f; 这就是我们今…

MySQL 8.x 自签证书通过keytool和openssl转成JKS文件

一、写在前面 数据库MySQL 8.0 通过自签命令在datadir下生成了所有的证书文件。由于Java的JDK不支持直接加载PEM格式的证书&#xff0c;所以需要将PEM格式证书转换成Java能够直接加载的JKS格式证书。我们需要将根证书ca.pem转换成JKS格式的根证书truststore.jks&#xff0c;将…

快速认识,后端王者语言:Java

Java作为最热门的开发语言之一&#xff0c;长居各类排行榜的前三。所以&#xff0c;就算你目前不是用Java开发&#xff0c;你应该了解Java语言的特点&#xff0c;能用来做什么&#xff0c;以备不时之需。 Java 是一种高级、多范式编程语言&#xff0c;以其编译为独立于平台的字…

华为鸿蒙开发——Stage/FA模型在ArkTs语言、JS语言 实现页面互转

文章目录 一、ArkTs(Stage模型)二、ArkTs(FA模型)三、JS&#xff08;FA模型&#xff09; 一、ArkTs(Stage模型) 目的&#xff1a;实现两个页面的跳转功能 步骤&#xff1a; 1、打开entry > src > main > ets > pages 2、在默认页面基础上&#xff0c;我们添加一个…

前端vue导出PPT幻灯片,使用pptxgen.js,超详细(赋原数据)

即上一篇文章最终代码 前端vue导出PPT&#xff0c;使用pptxgen.js 前端vue导出PPT&#xff0c;使用pptxgen.js 一个平台下有10个国家&#xff0c;这个是后端返回数据固定的&#xff0c;每一个国家下面有10个物流方式&#xff0c;这10个物流方式是这10个国家都有的&#xff0c;…

【从零开始学习JVM | 第三篇】类的生命周期(高频面试)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。 在本文中&#xff0c;我们将深入探讨类的生命周期&#xff0c;从类加载到…

smartkit巡检E9000设备

https://support.huawei.com/enterprise/zh/doc/EDOC1100325140/f6eeacd6 打开链接&#xff0c;里面的内容很详细。

海外服务器和国内服务器有什么样的区别呢

海外服务器和国内服务器有什么样的区别呢&#xff0c;其实呢在外形方面是大同小异&#xff0c;除了外形还有一些其他方面还存在这一些差异。 一&#xff0c;地理位置的差异。 海外服务器——有可能在中国数据中心之外的任何国家地区&#xff0c;例如美国服务器&#xff0c;韩…

2.环境变量及接口关联

一、环境变量以及全局变量 操作流程 1.点击environment 2.点击environment右侧号&#xff0c;新增环境变量 3.在变量中输入变量名以及变量值 4.回到collection页面&#xff0c;修改变量环境 5.在collection中通过{{变量名}}调用变量 变量定义 环境变量&#xff1a;环境变量…

k8s部署单机模式的minio和minio-client

k8s部署单机模式的minio和minio-client 一、k8s部署minio1.1说明1.2 yaml内容1.3 步骤1.3.1 创建资源1.3.2 查看启动日志1.3.3 查看svc并访问控制台 二、docker部署minio-client2.1 查找镜像2.2 运行镜像2.3 绑定minio server 一、k8s部署minio 1.1说明 项目使用minio&#x…

用python测试网络上可达的网络设备

用python测试网络上可达的网络设备 之前使用的os在python中执行ping测试网络中可达的目标&#xff0c;但是他在执行ping命令时脚本会将系统执行ping时的回显内容显示出来&#xff0c;有时这些回显并不是必要的。如果用脚本一次性ping成百上千台网络设备或者URL时会影响美观和阅…

12、组合模式(Composite Pattern,不常用)

组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;有时又叫作部分-整体模式&#xff0c;它是一种将对象组合成树状的层次结构的模式&#xff0c;用来表示“部分-整体”的关系&#xff0c;使用户对单个对象和组合对象具有一致的访问性。 它在我们树型结构的问题中…

5+铜死亡+预后模型+分型生信思路,热点搭配免疫相关思路

今天给同学们分享一篇生信文章“The pathogenesis of DLD-mediated cuproptosis induced spinal cord injury and its regulation on immune microenvironment”&#xff0c;这篇文章发表在Front Cell Neurosci期刊上&#xff0c;影响因子为5.3。 结果解读&#xff1a; 基因芯…

【OpenGauss源码学习 —— (RowToVec)算子】

VecToRow 算子 概述ExecInitRowToVec 函数ExecRowToVec 函数VectorizeOneTuple 函数 ExecEndRowToVec 函数总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在…

使用Python的PyQt实现财务综合计算

背景&#xff1a; 考核内容 使用 Python 编写程序代码&#xff0c;设计一个带交互界面的财务分析软件&#xff0c;并满足以下要求: PART1:《财务软件设计思路报告》 (30分) (1)编写《财务软件设计思路报告》&#xff0c;描述你编制这个财务软件的设计目标、应用场景、设计思路…

uniapp多行文本展开或收起(兼容h5、微信小程序,其它未测试)

文章目录 一、效果图展示1、收起2、展开3、文本过短时隐藏按钮【查看更多、收起】 二、代码实现原理&#xff1a;判断文本是否过短1、html2、css3、 js&#xff08;1&#xff09;data数据定义&#xff08;2&#xff09;获取文本高度&#xff08;3&#xff09; 获取行数&#xf…

【Vue】安装 vue-router 库报错 npm ERR! ERESOLVE unable to resolve dependency tree

问题描述 运行npm install vue-router&#xff0c;安装vue-router库&#xff0c;npm报错。 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: my-project0.1.0 npm ERR! Found: vue2.7.15 npm ERR! node_mod…