炫酷gdb

在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢?

我们需要用到一个工具:gdb

我们知道VS中程序的版本大致有两种模式:debug(开发模式,可被调试)和release(发布模式,不可被调试),为什么会形成这样的差异呢?其实在编译器形成可执行程序的时候,会给可执行程序添加调试信息,gcc编译的时候默认生成的是release版本,这样实现gcc/g++使用debug模式编译(makefile):

processbar-debug:Main.c Processbar.cgcc -o $@ $^ -g.PHONY:clean
clean:rm -f processbar-debug 

debug和release版本的不同可以看出:

debug确实比release版本大了很多(11936-8792=3144) debug版本是新增调试信息,debug版本的肯定比release版本的占用空间大(确实如此则证明新增数据)

那为什么要存在这样的差异呢?

其实是因为使用角色的差异,用户是用户,程序员是程序员,用户是程序的使用者,他不需要知道如何调试,只要会用就好了,多放调试信息还浪费空间,但是程序员是开发者,必须要知道调试信息以供调试,否则开发受阻,bug很难de出来(在公司,产品经理==用户,有的时候产品经理就很抽象,假用户威给程序组没事找事,我要diss这类产品经理)

可以这样来查看debug版本下的调试信息:

readelf -S processbar-debug

 .rodata:只读区

.text:代码区

.data:数据区

.bss:未初始化全局数据区

debug信息: 

readelf -S processbar-debug | grep -i debug

下面简单介绍gdb的使用

使用前先安装下:

yum install -y gdb

所以想要使用就直接gdb+可执行程序名称

gdb processbar-debug

常用命令

quit/q

在进入调试器后想退出可直接quit或者q:

通过分屏可以看出gdb在使用时算一个超绝进程:

list/l

list可用于查询源文件内容,但是是不支持这样直接查询源文件的:

list Processbar.c

从第0行开始查: 

list 0

简写效果是一样的: 

l 0

一查默认是查十行,在gdb中是会记住上次执行过的命令的,所以只需要按回车就可以查询整个文件了:

 ​​​

 也可以这样查:

l Processbar.c:0

还可以查询某个具体函数:

l Processbar.c:ProcBar

 在查询某行的时候并不是从它开始,而是显示上下文:

l 15

run/r

直接r相当于VS中的F5,直接执行不调试 

break/b

直接执行需要配合断点一起使用,break/b就是打断点

b x         //x是行号

断点只能一个一个打 

可以指明给某个文件:

b Processbar.c:20

还可以直接给某个函数打断点:

b main

这样打出来的断点是位于函数的第一条语句处的 

与在VS中的打断点作比较: 

 打过断点的地方可以看出有红点,那gdb中怎么查看打过的断点呢?

可以使用这条命令(info break):

info b

 

i b  

 

 Enb:断点的使能:有/没有

delete/d

在打断点的时候通过文件名+行号打,但是删除的时候不可以通过这种方式删除

 

 通过加编号的方式删除断点:

d x                     //x为号码

 断点编号也是线性增长的

disable/enable

在VS中可以实现禁用断点的功能:

可以通过disable来禁用断点:

disable x                     //x为断点编号

 断点有但无用:

1.被禁用

2.为空行

可以通过enable命令来开启禁用的断点:

enable x             //x为断点编号

next/n

逐过程:F10

即遇到函数不进入函数调试

step/s

逐语句 :F11

遇到函数进入函数,进行逐语句调试

print/p 

在VS中调试是想要看到某些变量的变化过程

在gdb中可以这样来查看变量的变化过程:

p x             //x为变量名

地址也可以查哦:

p &i           //i为变量名

 但是这样查看又太麻烦了,太原始了哇!!!

 display/undisplay

display可以常显示变量

undisplay可以把当前常显示的内容去掉

undisplay x             //x为变量编号
finish

finish是运行结束所在函数就停止 

until

 在调试时可能出现的情况还有比如任意跳转到函数的某一行处(中间代码都运行了)

until x                         //x为行号
info

 info b是查看断点的情况,info locals则可用于查看当前栈帧局部变量的值

info locals   
i locals
set var

set var可用于修改变量的值

set var i=100            //将i的值变为100

区域化执行 

 调试工具的核心作用是帮助你找问题,具体的解决需要人为,如果已经定位到问题所在行,那就不需要进行调试了,调试是为了帮助我们避免进行干瞪眼这种费时费力的调试方法诞生的,如果一份代码几万行,从头盯到尾是很费时费力的,我们希望它做的是区域化执行

因为有断点的存在,我们就可以通过断点实现区域化执行,从一个断点运行到下一个断点处,按范围去打断点就可以实现按范围查找,二分打可快速缩小范围

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

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

相关文章

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间 遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。 重叠区间问题 435. 无重叠区间 题目链接 435 给定一个区间的集合 i…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”,这意味着我们必须正确解释该术语,我们会这样做,但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道,DevOps 没有明确的定义。是的。 大多数情况下&a…

07. 哨兵模式

文章目录 概述哨兵模式多哨兵模式测试哨兵模式优缺点哨兵模式的配置 概述 主从切换的技术是,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这需要人工干预,还会造成一段时间内服务不可用。所以我们考虑使用哨兵模式。…

安卓实现5个底部导航栏切换fragment

步骤,写 5 个 fragment 自定义的类5个布局文件: package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符; 等待下载完成 4.到…

Web安全:企业如何抵御常见的网络攻击?

近年来随着人类社会向数字世界的加速发展,勒索软件攻击事件在全球范围内呈现快速上升的态势,几乎所有国家的政府、金融、教育、医疗、制造、交通、能源等行业均受到影响,可以说有互联网的地方就可能发生勒索软件攻击事件。 Web安全是一个大课…

蓝桥杯2023(十四届)省赛——统计日期(八重神子)

统计日期 2.日期统计 - 蓝桥云课 (lanqiao.cn) 其实一开始我想直接暴力的,然后写着写着突然觉得可以优化一下: 优化方法:先找所有2023的位置,记录初始和最后的位置 找出所有合法日期的位置,使用前缀和,计…

C语言基础-静态变量(static)

在C语言中,static关键字有多种用途,主要与变量的存储期(lifetime)和可见性(visibility)有关。以下是static在C语言中的主要用途: 局部静态变量: 在函数内部定义的局部静态变量&#…

2024-05-24 思考-关于软件架构设计

摘要: 2024-05-24 思考-关于软件架构设计 软件架构设计: 虽然在商业的战略中,软件代码只是起到最后的一个环节,但是对于业务本身来说,还是应该站在商业的视角上,去看待技术的实现此前读过的比较有价值的关于软件架构设计的书&…

【全开源】简单商城系统(PC/UniAPP)

轻松构建您的在线商店 在当今数字化时代,拥有一个在线商店对于许多商家来说已成为必不可少的营销手段。为了满足这一需求,我们推出了“简单商城系统源码”,让您轻松构建并管理您的在线商店。 一、简单易用,快速上手 “简单商城…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,常用于在客户端和服…

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果,项目demo演示如下所示: 项目解析: new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象,第一个参数传…

用python做的一个井子棋游戏——浔川python社

简介: 在井子棋的基础上,我们改进了登录界面。允许大量玩家注册! # -*- coding: utf-8 -*- import tkinter as tk import tkinter.messagebox import pickle import random# 窗口 window tk.Tk() window.title(欢迎进入python) window.geometry(450x2…

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活,正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

TypeScript中的类型推断(Type Inference):自动化的类型安全

TypeScript中的类型推断(Type Inference):自动化的类型安全 引言 类型推断是TypeScript的一个关键特性,它允许编译器根据值的初始化或上下文自动推导出变量的类型。这减少了需要显式指定的类型注解,同时保持了代码的…

springboot中不同请求方式的注解有哪些,有什么含义

在Spring Boot中,处理Web请求通常使用Spring MVC框架,它提供了一系列的注解来支持不同的HTTP请求方式。以下是一些常用的注解及其含义: RequestMapping: 这是一个通用的映射注解,可以用于映射类或方法到HTTP请求。它支持多种请求方…

Python进阶之深入类和对象

鸭子类型 鸭子类型实际上类似于多态的概念。指的是我们在使用一个父类的时候,不关心子类具体是什么,只要之类实现了父类必须要要实现的方法,我们就把它当成父类使用。 在下面的案例中,鸭子,猫,狗都是动物…

webgl three 几何体

辅助几何体 // AxesHelper:辅助观察的坐标系const axesHelper new THREE.AxesHelper(400);scene.add(axesHelper);//辅助观察网格const gridHelper new THREE.GridHelper(300, 25, 0x004444, 0x004444);scene.add(gridHelper); 基础几何体 //长方体const geomet…

时光初创知识付费模板 3.6.4 安装包 附教程

源码地址: https://wwv.lanzouh.com/b080wj8eh

码蹄集部分题目(2024OJ赛15期;前缀和+栈+堆+队列)

1🐋🐋🐋门票(钻石;前缀和) 时间限制:1秒 占用内存:128M 🐟题目描述 🐟输入输出格式 🐟样例 🐚样例 🐚备注 &#x1f4…