『Linux』GDB调试

前言

GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
一般来说,GDB 主要完成下面四个方面的功能:
启动程序:可以按照自定义的要求随心所欲的运行程序。
设置断点:可让被调试的程序在所指定的调置的断点处停住,断点可以是条件表达式。
打印信息:当程序被停住时,可以检查此时程序中所发生的事。
修改变量:可以通过修改程序中的变量,将一个 BUG 产生的影响修正从而测试其他 BUG。

debug版本与release版本

  • 假设存在一段代码:

    //文件为 gdb_test.cpp
    #include<iostream>int GetSum(int n){ //主要是测试 ;其功能为计算1至n之和;int ret = 0;for(int i = 1;i<=n;++i){ret+=i;}return ret;}int main(){int n =0;std::cin>>n;int ret = GetSum(n);std::cout<<ret<<std::endl;return 0;                                                         }
    

    再使用g++进行编译:

    g++ gdb_test.cpp -o test 
    

    编译链接过后进行运行确保程序无误;

    在这时若是想使用gdb进行调试:

    gdb test
    

    (前提是得有gdb),若是没有gdb则需要使用yum进行安装:

    sudo yum install -y gdb
    

    将会出现这样的提示:

    (no debugging symbols found) … done.

    没有找到调试符号

    这正是因为,在使用gcc/g++进行编译链接所生成的可执行文件默认是release版本的,无法进行debug调试;

    这里可以再回顾一下gcc/g++的特性;

    链接生成的可执行程序
    gcc/g++在不使用-static修饰的时候默认为动态链接;默认生成的可执行程序的版本为release版本,若是需要生成debug版本需要在末尾处加上-g

生成debug版本的可执行程序:

g++ gdb_test.cpp -o test_debug -g 

添加-g选项代表该可执行程序为以debug方式发布的

生成debug版本的可执行程序后即可以进行调试;

gdb test_debug

在此之前可以使用readelf来查看ELF格式文件信息;

readelf -S 'filename' #使用-S选项显示节头信息

或者

readelf -S 'filename' | grep -i debug  #使用-S选项显示节头信息,grep debug为找出所有带debug的信息,-i为不区分大小写;

以第二条命令查看release版本的可执行程序的段信息时可以看到

由于没有debug,所以不显示;同时因为没有debug也不能进行调试;

同时使用第二条命令对所生成的debug版本的可执行程序时为


debug版本和release版本的大小差是因为在debug版本中多出了许多调试信息

在进行调试之前先使用Makefile以方便构造与清除


GDB操作

启动与退出gdb

gdb 'filename' #使用该命令即可启动gdb调试,其中filename为可执行程序(debug版)
quit #要退出gdb时只要输入quit或者q即可退出

显示代码

list #当然大多数情况下会使用简写 l ,从头开始即为 l 0 并回车至所有代码显示完毕

一般使用list时,gdb将会按照自己的方式将代码进行显示,可能不显示全,单若是希望从头开始显示时则可以使用 l 0 即从头显示代码,单此时也并不会显示完全,所以要用回车至所有代码显示完全;

同时在这里该注意,gdb与平时的Linux操作中较为不同的是;

在gdb调试过程中,gdb将会记住你上次的指令,这也是在使用list(或者l)后按照回车能够继续显示代码,在此处按回车时将会继续list的命令;


控制程序执行

命令功能
run < arguments > 或者 r < arguments >运行或者重新运行程序,并传递指定的参数。如果设置了断点,程序会在断点处暂停,并显示当前的源代码和寄存器值;
如 : run arg1 arg2运行程序,并传递arg1和arg2为参数;
continue 或者 c继续运行程序 (若是有断点则至下一个断点处停止,否则运行至程序结束)
next 或者 n逐过程调试(不进入函数)
step 或者 s逐行调试 (会进入函数)
finish 或者 f执行程序至当前函数结束(返回),并显示返回值;
return < expression >或者 r < expression >强制当前函数立即返回,并将返回值设定为指定的表达式。如果不指定表达式则返回0;
jump < location >或者 j < location >强制程序跳转到指定位置,可以是行号、或者是地址;将可能改变程序的正常流程;

断点设置与取消:

命令功能
(gdb) break main(main的这个位置可以是函数名、文件名: 、行号或者内存地址)在main函数的第1行的位置设置断点(以此类推,所有的函数都可以像这样进行断点设置)
(gdb) break test.c:10 在同一目录下的test.c源文件设置断点(暂未证实,应该另有)
(gdb) info breakpoints 查看当前节点个数以及编号位置等信息;可以简写为i b 以此类推,但是此处的breakpoints并不能用来进行断点(不能使用breakpoints 10 这类的方式进行断点)
(gdb) delete 1 删除编号为1 的节点 ;delete也可以简写为d;
(gdb) delete 删除所有节点
condition <number编号> <expression表达式>或者cond <number编号> <expression表达式> 给指定编号的断点添加条件,当条件为真时,起到断点作用

查看(或修改)变量、寄存器与内存

命令功能
print 或者 p 打印某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等。
print x 打印变量x的值
print *p打印指针p所指向的值
print add(10,20);打印调用add函数并传入10 20作为参数后的返回值;
set < expression>修改某个变量或者表达式的值,修改规则同上;
set x = 10 将变量x修改为10,同理该方法也同样可以用来修改指针
set add(10,20) = 100 修改调用函数并传递10与20作为参数后修改返回值为100
info registers或者i f显示所有寄存器的值
info registers < name >或者i f 显示指定的寄存器的值
info registers eax 显示eax寄存器的值
set $< name > = < value >修改寄存器的值
set $eax = 5 将寄存器eax 的值修改为5

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

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

相关文章

分布式数据库HBase(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录 写在前面1. strlen1.1 函数介绍1.2 模拟实现 2. strcpy2.1 函数介绍2.2 模拟实现 3. strcat3.1 函数介绍3.2 模拟实现 4. strcmp4.1 函数介绍4.2 模拟实现 写在前面 本篇文章介绍了C语言中常用的字符串处理函数&#xff0c;包括strlen、strcpy、strcat和strcmp。文章…

10-网络篇-DHCP获取的参数详解

一个设备接入路由器局域网时&#xff0c;是通过DHCP获取网络信息&#xff0c;从而完成网络配置的获取。如下图所示为windows系统通过DHCP所要获取的网络配置&#xff1a;IP、子网掩码、网关、DNS服务器。任何设备要上网前&#xff0c;都需要知道这几个参数&#xff0c;下面对这…

拼多多商品品牌数据采集接口,拼多多商品详情数据接口,拼多多API接口

拼多多商品品牌数据采集的方法如下&#xff1a; 手动数据采集。直接在拼多多平台上搜索并手动复制商品数据&#xff0c;适合采集小批量的商品数据。自动数据采集。通过爬虫来自动获取&#xff0c;具体步骤如下&#xff1a; 选择爬虫框架并安装。Python爬虫框架有很多&#xf…

13SpringMVC中拦截器的配置(拦截规则)和多个拦截器的preHandle,postHandle执行顺序原理详解

拦截器 Servlet中的过滤器的实现及其原理,参考文章 配置一个拦截器 SpringMVC中请求的处理流程: 用户请求—>listener—>filter—>DispatcherServlet—>filter—>preHandle—>controller—>postHandle 第一步: 编写一个Java类实现HandlerInterceptor(…

TCP/IP(五)TCP的连接管理(二)三次握手细节

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注&#xff1a; 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人&#xff1a; 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

SQLAlchemy 使用封装实例

类封装 database.py #! /usr/bin/env python # -*- coding: utf-8 -*-import sys import json import logging from datetime import datetimefrom core.utils import classlock, parse_bool from core.config import (MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASS,MYSQL_DA…

CustomShapes/自定义形状, CustomCurves/自定义曲线, AnimateableData/数据变化动画 的使用

1. CustomShapes 自定义形状视图 1.1 资源图文件 therock.png 1.2 创建自定义形状视图 CustomShapesBootcamp.swift import SwiftUI/// 三角形 struct Triangle: Shape{func path(in rect: CGRect) -> Path {Path { path inpath.move(to: CGPoint(x: rect.midX, y: rect.mi…

Win10玩游戏老是弹回桌面的解决方法

在Win10电脑中&#xff0c;用户不仅可以办公&#xff0c;也可以畅玩各种各样的游戏。但是&#xff0c;有时候用户在玩游戏的时候&#xff0c;遇到了游戏老是自己弹回桌面的问题&#xff0c;这样是非常影响游戏体验的&#xff0c;却不清楚具体的解决方法。下面小编给大家带来了简…

二叉搜索树-- 删除节点-力扣 450 题

例题细节已经讲过&#xff08;二叉搜索树的基础操作-CSDN博客&#xff09;&#xff0c;用非递归和递归均可实现&#xff0c;这里只给出递归参考代码&#xff1a; public TreeNode deleteNode(TreeNode node, int key) {if (node null) {return null;}if (key < node.val) …

算法进阶——字符串的排列

题目 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10 要求&#xff1a;空间复…

【JavaEE初阶】 死锁详解

文章目录 &#x1f38b;死锁的概念&#x1f333;死锁的三个典型情况&#x1f6a9;一个线程一把锁&#x1f6a9;两个线程两把锁&#x1f6a9;n个线程m把锁(哲学家就餐问题) &#x1f384;如何破除死锁&#x1f6a9;破坏循环等待 本文重点&#xff1a; 死锁咋回事 死锁的三个典型…

【SkyWalking】SkyWalking是如何实现跨进程传播链路数据?

文章目录 一、简介1 为什么写这篇文章2 跨进程传播协议-简介 二、协议1 Standard Header项2 Extension Header项3 Correlation Header项 三、跨进程传播协议的源码分析1 OpenTracing规范2 通过dubbo插件分析跨进程数据传播3 分析跨进程传播协议的核心源码 四、小结参考 一、简介…

亚马逊,速卖通,敦煌产品测评补单攻略:低成本、高安全实操指南

随着电商平台的发展和消费者对产品质量的要求提升&#xff0c;测评补单成为了商家们提升销售和用户口碑的关键环节。然而&#xff0c;如何在保持成本低廉的同时确保操作安全&#xff0c;一直是卖家们面临的挑战。今天林哥分享一些实用的技巧和策略&#xff0c;帮助卖家们产品的…

嵌入式C语言自我修养《内存堆栈管理》学习笔记

目录 一、Linux环境下的内存管理 二、栈的管理 三、堆内存管理 四、mmap映射区 五、内存泄漏与防范 六、常见的内存错误及检测 C程序中定义的函数、全局变量、静态变量经过编译链接后&#xff0c;分别以section的形式存储在可执行文件的代码段、数据段和BSS段中。当程序运…

【Zabbix】Zabbix学习笔记

现在Zabbix Server存在的问题&#xff1a; 问题1&#xff1a; Zabbix server: Utilization of discoverer processes over 75% 问题2&#xff1a; Zabbix server: Utilization of icmp pinger processes over 75% 优化的解决办法是修改配置文件把Discovery和Pinger进程数量调大…

04-RocketMQ源码解读

目录汇总&#xff1a;RocketMQ从入门到精通汇总 上一篇&#xff1a;03-RocketMQ高级原理 这一部分&#xff0c;我们开始深入RocketMQ的源码。源码的解读是个非常困难的过程&#xff0c;每个人的理解程度都会不一样&#xff0c;也不太可能通过讲解把其中的细节全部讲明白。我们今…

panads操作excel

panads简介 pandas是基于Numpy创建的Python包&#xff0c;内置了大量标准函数&#xff0c;能够高效地解决数据分析数据处理和分析任务&#xff0c;pandas支持多种文件的操作&#xff0c;比如Excel&#xff0c;csv&#xff0c;json&#xff0c;txt 文件等&#xff0c;读取文件之…

unity发布微信小游戏,未找到 game.json报错原因

unity发布微信小游戏&#xff0c;未找到 game.json报错原因 同一个问题相隔一年遇到两次&#xff0c;两次原因都不一样&#xff0c;记录一下&#xff0c;以后不要再掉坑里 原因一&#xff1a;申请的appID是小程序不是小游戏 解决方法&#xff1a;需要在程序平台修改服务类目 如…

哈希应用之布隆过滤器

文章目录 1.介绍1.1百度搜索1.2知乎好文1.3自身理解 2.模拟实现2.1文档阅读2.2代码剖析 3.误判率的研究4.布隆过滤器的应用4.1如何找到两个分别有100亿个字符串的文件的交集[只有1G内存].分别给出精确算法和近似算法4.2如何扩展BloomFilter使得它支持删除元素的操作 5.整体代码…