[Linux入门]---gdb调试

2023-09-22 07:45:00

0.前言

平时我们在Windows操作系统下写代码的时候经常会写出bug,此时必不可少地会使用我们VS编译器的调试工具,而我们在Linux操作系统使用gcc编译器时,出现了bug又应该怎么进行调试呢?接下来让我们一起学习一下Linux调试器—gdb吧!

1.gdb调试

课前需知

① 程序的发布方式有两种,debug模式和release模式, Linux gcc/g++编译出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g 选项②一般情况下,可执行程序文件是交给测试人员在release模式进行测试或发布给用户使用的产品,是不需要包含调试信息,所以需要我们使用-g选项加上调试信息。

我们在test.c文件中写的代码如下:

#include<stdio.h>    
int AddNum(int num)    
{    
    int sum=0;    
    
    for(int i=0;i<=num;i++)    
    {    
        sum+=i;    
    }    
    
    return sum;    
}    
int main()    
{    
    printf("debug begin\n");    
    
    int ret=AddNum(100);    
    
    printf("%d\n",ret);    
    
    printf("debug end\n");    
    
    return 0;                                                                                                                                                        
}

我们使用的gcc编译编译指令如下:

 gcc -o test_debug test.c -std=c99 -g

或者我们创建一个Makefile文件定义如下指令:

test:test.c    
    gcc -o $@ $^ -std=c99 -g    
.PHONY:clean    
clean:    
    rm -rf test_debug   

gcc编译指令中,因为我们在代码中使用了for循环,需要C99标准库的支持,所以需要加上-std=c99-g 选项编译生成调试信息,gdb工具才可以使用该信息进行调试
在这里插入图片描述
从上面可以看出,含调试信息的test_debug可执行文件比不含调试信息test可执行程序文件大。

LInux指令:

readelf -S 可执行文件名 | grep -i debug
//查询可执行文件是否包含调试信息

在这里插入图片描述

gdb指令

使用yum安装:

yum install gdb -y

gdb使用语法:

gdb 可执行文件名

在这里插入图片描述
此时表明我们已经进入了调试状态,请看如下指令:

1.按住ctrl+d键或quit(q):可以退出gdb调试
在这里插入图片描述

2.list/l 行号:显示binFile源代码,一直按l键接着上次的位置往下列,每次列10行,直到末尾!(使用回车键可以自动调用最近的历史指令)
list/l+源文件名:行号,多文件的时候科使用
在这里插入图片描述

3.list/l 函数名:列出某个函数的源代码。
在这里插入图片描述
4.run(或r):从开始连续而非单步执行程序
在这里插入图片描述
5.break(b) 行号:在某一行设置断点
在这里插入图片描述

6.info(或i) break(breakpoints或b):查看端点信息。
在这里插入图片描述
7.break(或b) 函数名:在某个函数开头设置断点
在这里插入图片描述

8.delete(或d) breakpoints(或b):删除所有断点
delete breakpoints n:删除断点编号为n的断点
在这里插入图片描述
9.n 或 next:单条执行,不进入函数(逐过程执行)
在这里插入图片描述

10.step(或s):进入函数调用,逐语句执行
在这里插入图片描述
11.continue(或c):从当前位置开始连续而非单步执行程序,可以从一个端点处运行到下一个端点处。
在这里插入图片描述
12.print(或p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p +变量/地址:打印变量值/地址值。
在这里插入图片描述
13,finish:执行到当前函数返回,然后挺下来等待命令。
在这里插入图片描述
14.info(i) locals:查看当前栈帧局部变量的值
在这里插入图片描述
15.set var+修改的值:修改变量的值
在这里插入图片描述
16.display 变量名:跟踪查看一个变量,每次停下来都显示它的值
在这里插入图片描述
17.undisplay:取消对先前设置的那些变量的跟踪
在这里插入图片描述
18.until X行号:跳至X行,如果X行为空行,会跳到下一个有效行的位置!
在这里插入图片描述

19.disable breakpoints(端点编号):禁用断点,断点还存在但是端点不起作用了
在这里插入图片描述

20.enable breakpoints:启用断点
在这里插入图片描述

21.breaktrace(或bt):查看各级函数调用及参数,即函数调用堆栈的信息。
在这里插入图片描述

2.总结

通过上面的学习,我们可以发现Linux系统gcc编译器gdb调试与windows系统VS编译器调试有相似的地方:

指令1:run---ctrl+F5执行程序
指令2:break---F9打断点
指令3:delete+断点编号---F9+光标指定行数,取消指定行数断点
指令4:delete+break(breakpoints)---ctrl+shift+F9,取消所有断点
指令5:finish---shfit+F11跳出执行当前执行点所处函数的剩余行
指令6:quit---shift+F5取消调试
指令7:next---F10逐过程调试
指令8:step---F11逐语句调试
指令9:display+变量---监视窗口

更多推荐

C++项目:仿mudou库实现高性能高并发服务器

文章目录一、实现目标二、前置知识(一)HTTP服务器1.概念2.Reactor模型:3.分类一、实现目标仿muduo库OneThreadOneLoop式主从Reactor模型实现高并发服务器:通过咱们实现的高并发服务器组件,可以简洁快速的完成⼀个高性能的服务器搭建。并且,通过组件内提供的不同应⽤层协议支持,也可以快速完

代码配置仓库GitLab安装部署

Github是目前世界上代码行数最多的在线软件版本配置库平台,而Gitlab是Github对应的开源版本,本文主要描述Gitlab的安装部署。https://about.gitlab.com/https://gitlab.cn/install/如上所示,从官方网站中下载不同操作系统的版本,本文主要描述Centos的安装

UML类图

优质博客:IT-BLOG-CNUML(UnidiedModelingLanguage)统一建模语言:用来设计软件的可视化建模语言,能够表达软件设计中的动态与静态信息。UML定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。IDEA展示类图及类图关系【1】选中.java或者编辑的.jav

部署Kafka

kafka:kafka_2.13-3.5.1NOTE:YourlocalenvironmentmusthaveJava8+installed.ApacheKafkacanbestartedusingZooKeeperorKRaft.Togetstartedwitheitherconfigurationfollowone

MySQL 篇

目录1、数据库三范式2、数据库事务的特性3、MySQL数据库引擎4、说说InnoDB与MyISAM的区别5、索引是什么?6、索引数据结构7、MySQL索引类型有哪些?8、索引有什么优缺点?9、索引设计原则9、使用索引应该注意些什么?10、什么是视图?11、什么是内联接、左外联接、右外联接?12、说一说drop、dele

网络安全(黑客技术)自学规划

一、什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web防御技术(WAF)。作为一个合格的网络安全工程

Caton Media Xstream: 重新定义实时内容交付服务

//编者按:随着公共互联网愈加复杂,besteffort的基本原型已无法满足越来越多的有QoS保障需求的实时内容交付服务。而专线、卫星等传统解决方案存在部署成本高、周期长等问题,无法快速响应各类需求。LiveVideoStackCon邀请到了科腾科技的魏凌,为我们介绍CatonMediaXstream平台的解决方案。文

selenium环境+元素定位大法

selenium与webdriverSelenium是一个用于Web测试的工具,测试运行在浏览器中,就像真正的用户在手工操作一样。支持所有主流浏览器WebDriver就是对浏览器提供的原生API进行封装,使其成为一套更加面向对象的SeleniumWebDriverAPI。使用这套API可以操控浏览器的开启、关闭,打开网

Springboot登录验证的统一拦截处理

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理背景如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证,代码重复,所以在本篇提供一个解决方案:定义一个拦截器,把请求都进行统一的处理,如果Sess

基于FPGA的图像白平衡算法实现,包括tb测试文件和MATLAB辅助验证

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览2.算法运行软件版本vivado2019.2matlab2022a3.部分核心程序`timescale1ns/1ps////Company://Engineer:////CreateDate:2023

全志H3 Linux编译尝试

全志H3Linux编译尝试主要参考:https://blog.csdn.net/qq_40731414/article/details/118684473部分内容介绍来自GPT,但是代码部分都会进行测试一、简介Linux编译的作用:生成可执行的内核映像:编译Linux内核的主要目的是从源代码生成一个可执行的内核映像(例

热文推荐