【Linux学习】日积月累——调试器gdb的使用教程

news2025/7/21 1:37:49

一、背景

  gdb是一款强大的命令行调试工具,可以形成执行程序、脚本。只需要几个简单的命令,就能够实现Windows环境下VC等IDE的图形化调式工具的功能。

调试的相关常识:

  • 程序的发布方式有两种,debug模式和release模式;
  • Linux gcc/g++出来的二进制程序,默认是release模式;
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项。

gdb的功能:

  • 启动程序时,能够按照开发者自定义的要求随心所欲的运行程序;
  • 可以让调试程序在开发者指定的位置的断点处停止;
  • 当程序停止时,可以检查此时程序中发生的事;
  • 动态改变程序的执行环境。

二、gdb的参数

2.1 案例分析

  为了更好地说明gdb的调试,使用c++源程序test.cpp进行案例分析,详见下列代码。

  1 #include<iostream>
  2 using namespace std;
  3 
  4 int addToTop(int top)
  5 {
  6     cout<<"enter addToTop"<<endl;
  7 
  8     int sum = 0;
  9     for(int i = 0;i<=top;i++)
 10     {
 11         sum += i;
 12     }
 13     cout<<"quit addToTop"<<endl;
 14     return sum;
 15 }
 16 
 17 
 18 int main()
 19 {
 20     int top = 100;
 21     int result = addToTop(top);
 22     cout<<"result: "<<result<<endl;
 23     return 0;
 24 }  

  创建建文件Makefile,生成自动化构建工具。在调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中,使用编译器(gcc/g++)的-g参数可以做到这点:

  1 mytest:test.cpp
  2     g++ -o mytest test.cpp -g -std=c++11                                               //如果没有-g,将看不见程序的函数名、变量名                                                                      
  3 .PHONY:clean
  4 clean:
  5     rm -f mytest

**g++**编译生成可执行文件mytest

image-20230307200142488

使用gdb调试的启动方法:

//启动gdb方法1
gdb <program>
//<program>表示可执行程序,一般在当前目录下
    
//启动gdb方法2
gdb <program>core
//用gdb同时调试一个运行程序和core文件,core文件是程序非法执行后core dump产生的文件

//启动gdb方法3
gdb <program> <PID>
//若启动的程序是一个服务程序,那么可以指定这个程序运行时的进程PID。

这里我么使用方法1进行案例分析。
image-20230305155425447

readlf命令常用于对可执行程序的分析,具体语法如下:

readelf -S

image-20230305161031537

readlf这里不作说明,后续会详解。使用命令list或l随机列出10行代码:

image-20230305161217090

l命令后接数字,则规定了从哪一行开始展示接下来的10行代码:

image-20230305161252378

此外,gdb会记住最近的位置,直接回车表示即可。

image-20230305161359569

run或r命令表示运行程序:

image-20230305161459268

break或b命令设置断点,下图在源程序第19行处设置断点;info b 查看断点信息。

image-20230305162230365

当前断点的编号,不能接行号

image-20230305162402770

断点的编号依次递增

image-20230305162549757

image-20230305162818831

image-20230305162912202

下图中,r运行程序后在源程序第20行处停住,next或n命令执行但语句

image-20230307201139574

print或p命令。打印局部变量sum的值:

image-20230307201831293

continu命令则继续运行程序

image-20230305204157990

2.2 gdb常用参数

gdb退出使用 ctrl+d或quit调试命令;

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

list/l 函数名:列出某个函数的源代码;

r或run:运行程序(开始调试);

n或next:单条执行;

s或step:进入函数调用;

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

enable:开启断点;

disable:关闭断点;

delete breakpoint:删除所有断点;

delete breakpoint n:删除序号为n的断点;

info break(b):查看断点信息;

print§:打印表达式的值,通过表达式可以修改变量的值或调用函数;

p 变量:打印变量值;

set var:修改变量的值;

display:常显示(内置类型、结构体等自定义类型,stl),追踪查看一个变量,每次停下来都显示它的值;

undisplay:取消常显示(取消对先前设置的哪些变量的追踪);

until 行号:在函数内,进行指定位置跳转,执行完区间代码;

finish:进入一个函数,只执行完该函数,就停下来;

c或continue:从一个断点处,直接运行到下一个断点处;

breaktrace(或bt):查看各级函数调用及参数;

info (i) locals:查看当前栈帧局部变量的值。

  不积跬步,无以至千里;不积小流,无以成江海。

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

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

相关文章

197.Spark(四):Spark 案例实操,MVC方式代码编程

一、Spark 案例实操 1.数据准备 电商网站的用户行为数据,主要包含用户的 4 种行为:搜索,点击,下单,支付 样例类: 2. Top10 热门品类 先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。 我们有多种写法,越往后性能越…

【Linux开发笔记】《Linux嵌入式开发从0到1》(一):初探Linux——与Linux的初次相遇

1.什么是Linux Linux就是一个操作系统&#xff0c;就是一个开源、自由的操作系统&#xff0c;就是一个免费使用和自由传播的类UNIX操作系统&#xff0c;就是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。 简单来讲&#xff0c;Linux就是一个操作系统而已… …

React的Hooks

React Hooks useState useMemo 和usecallback Hooks显示的指明因变量有什么好处 当使用时&#xff0c;y与changeX会被缓存下来&#xff0c;只要x不变&#xff0c;始终读取的是缓存的值&#xff0c; 如果不使用时&#xff0c;每次函数组件执行时&#xff0c;实际会基于x&#xf…

计算机写论文时,怎么引用文献? - 易智编译EaseEditing

首先需要清楚哪些引用必须注明[1]&#xff1a; 任何直接引用都要用引号并注明来源&#xff1b; 任何不是自己的口头或书面的观点、解释和结论都应注明来源&#xff1b; 即使不用原话&#xff0c;但是他人的思路、概念或观点也应注明&#xff1b; 不要为了适合你的观点修改原…

机器学习——无监督学习

机器学习的分类一般分为下面几种类别&#xff1a;监督学习( supervised Learning )无监督学习( Unsupervised Learning )强化学习( Reinforcement Learning&#xff0c;增强学习)半监督学习( Semi-supervised Learning )深度学习(Deep Learning)Python Scikit-learn. http: // …

day40|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

软件测试8

一 缺陷 软件缺陷&#xff1a;是指软件或程序中存在的各种问题及错误&#xff0c;会导致软件产品在某种程度上不能满足用户的需求 二 软件缺陷的判定标准 1.软件未达到需求规格说明书中表明的功能 2.软件出现了需求规格说明书不会出现错误的地方 3.软件的功能超出了需求规格…

14 nuxt3学习(布局 渲染模式 插件plugin 生命周期)

布局 布局是围绕包含多个页面的公共用户界面的页面的包装器&#xff0c;例如页眉和页脚显示。 布局是使用slot 组件显示页面内容的Vue文件。 默认情况下使用layouts/default.vue文件。 自定义布局可以设置为页面元数据的一部分。 方式一&#xff1a;默认布局 在layouts目录下…

Xmind快捷键大全

Xmind快捷键大全 1、常用 CtrlShiftL 快捷键助手CtrlHome 返回中心主题Enter 插入主题Tab 插入子主题F2 编辑主题F3 添加/编辑标签F4 添加/编辑备注F6 下钻ShiftF6 上钻Delete 删除Ctrl] 插入摘要CtrlI 插入图片CtrlShiftH 插入超链接Ctrl1,2,3,4,5,6快速添加优先等级图标Ctr…

applicationContext相关加载

spring refresh 概述 refresh是一个方法&#xff0c;spring中所有的ApplicationContext容器都需要通过refresh方法初始化&#xff1b; 处理步骤 其中refresh方法包含12个主要的处理步骤&#xff1a; 1、第1个步骤做前置准备 2、第2~6步骤创建BeanFactory&#xff08;Appl…

Java中垃圾回收(GC)算法详解

咱们要进行垃圾回收&#xff0c;是不是要知道哪些对象是垃圾&#xff0c;然后针对这些垃圾要怎么回收呢&#xff1f;那本篇文章我们就将垃圾回收分为标记垃圾、清除垃圾两个阶段讲解&#xff0c;详细说明每个阶段都有那些算法。1、标记阶段算法在堆里存放着几乎所有的Java对象实…

2023年交通与智慧城市国际会议(ICoTSC 2023)

2023年交通与智慧城市国际会议(ICoTSC 2023) 重要信息 会议网址&#xff1a;www.icotsc.org 会议时间&#xff1a;2023年7月28-30日 召开地点&#xff1a;长沙 截稿时间&#xff1a;2023年6月15日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介…

轻松玩转开源大语言模型bloom(一)

前言 chatgpt已经成为了当下热门&#xff0c;github首页的trending排行榜上天天都有它的相关项目&#xff0c;但背后隐藏的却是openai公司提供的api收费服务。作为一名开源爱好者&#xff0c;我非常不喜欢知识付费或者服务收费的理念&#xff0c;所以便有决心写下此系列&#…

【Flutter】入门Dart语言:操作符的基本用法

文章目录 一、前言二、常用的操作符1.算术操作符2.关系操作符3.逻辑操作符4.赋值操作符5.三元运算符三、总结一、前言 当我们在编写Flutter应用程序时,操作符是我们不可或缺的工具。它们是用于执行各种操作的关键字和符号,可以帮助我们简化代码并提高效率。熟练掌握各种类型…

Tomcat在linux环境中开机自启(定时重启)

一、Tomcat开启自启 我们经常会遇到服务器断电或异常&#xff0c;而异常后tomcat中部署的web项目需要我手动去启动。为此&#xff0c;特别贡献出Linux环境中Tomcat开机自启的方式供学习使用。 1. 添加JAVA_HOME并配置tomcat自启 vi /etc/rc.local 添加如下语句&…

ChIP-seq 分析:基因集富集(11)

动动发财的小手&#xff0c;点个赞吧&#xff01; 1. 基因集检测 转录因子或表观遗传标记可能作用于按共同生物学特征&#xff08;共享生物学功能、RNAseq 实验中的共同调控等&#xff09;分组的特定基因组。 ChIPseq 分析中的一个常见步骤是测试常见基因集是否富含转录因子结合…

分布式新闻项目实战 - 13.项目部署_持续集成(Jenkins) ^_^ 完结啦 ~

欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游。 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff09;自媒体文章审核延迟任务kafka及文章上下架App端文章搜索后台系统管理Long类型精度丢失问题定时计算热点文章&#xff08;xxl-Job…

eBay是不是一定要养号?是的

相信每个运营过eBay的用户遇到过这个棘手的问题&#xff0c;eBay个人账户的刊登数量是有限的&#xff0c;尤其是新账户只有5个sku&#xff0c;所以一开始的运营会比较艰难。想要快点走上正轨的话&#xff0c;就一定要去注重这个“养号”。eBay运营模式 1.拍卖 eBay最开始是一个…

Java的算数运算符、关系运算符、逻辑运算符、位运算符

JAVA的运算符&#xff0c;分为四类&#xff1a; 算数运算符、关系运算符、逻辑运算符、位运算符 章节一 算数运算符(7)&#xff1a; 加()、减(-)、乘 (*)、除 (/)、 取余(%)、 加加()、 减减(–)、 章节二 赋值运算符 赋值()、加等()、减等(-)、乘等(*)、除等(/)&#xff0c;取…

LeetCode·每日一题·1096. 花括号展开 II·DFS+HASH

作者&#xff1a;Guang链接&#xff1a;https://leetcode.cn/problems/brace-expansion-ii/solutions/997719/xss1096-hua-gua-hao-zhan-kai-iiby-zgh-by-vumf/来源&#xff1a;力扣&#xff08;LeetCode&#xff09;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;…