【GDB调试技巧】提高gdb的调试效率

目录

🌞gdb的启动

🌞gdb技巧

🌼1. gdb小技巧汇总

🌼2. 打印输出指定地址的值

🌼3. 查看当前执行到哪行代码+代码内容

3.1 方式一:info line 结合 list 。

3.2 方式二:f

3.3 方式三:tui模式

🌼4. 查看断点信息

🌼5. 退出函数


🌞gdb的启动

准备内容

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

对于.c文件:

gcc -g -o hello hello.c

对于.cpp文件:

g++ -g -o hello hello.cpp

启动GDB的方法有以下几种:

  1. gdb program
    program 也就是你的可执行文件,一般在当前目录下。
  2. gdb program core
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
  3. gdb program 1234
    如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb的help查看。


🌞gdb技巧

🌼1. gdb小技巧汇总

gdb技巧挺多的,比如说直接回车是继续执行上一次的代码


巧用tab补全

1. 比如输入b连续按下两次tab,可以查看gdb的所有b开头的gdb指令

2. 比如设置断点记不清函数名称,举个简单示例:希望b main 但由于记不清main的函数全称,在b ma之后连续按下两次tab,可以查看ma开头的所有函数名称。


TUI 模式:GDB 的界面会分为几个窗格,包括源代码窗格、汇编窗格、寄存器窗格等。

按下ctrl x a会显示下图的窗口(可以上下滑动查看原代码),其中箭头表示【当前准备执行但还未执行的开始位置】。再次按下ctrl x a会退出该窗口模式。


设置断点也可以直接b 接对应的代码行数

比如main函数在第47行,b main 等价b 47


🌼2. 打印输出指定地址的值

这里适用于已知结构体+地址。

比如说结构体TreeNode,地址为0x555555559300

打印每次都需要p root->xxxx...,如果树的深度太深则每次都需要从根节点root开始寻址太麻烦。

这里当我们已经知道了节点的地址后

打印指定地址0x555555559300的值和左右节点的值【这里是第三层】

p *((TreeNode*)0x555555559300)

打印其左右节点的值

p *((TreeNode*)0x555555559300)->left
p *((TreeNode*)0x555555559300)->right

 上面会显示当前的data值和左右指针的地址【即树TreeNode结构体的各个变量值】。


🌼3. 查看当前执行到哪行代码+代码内容

3.1 方式一:info line 结合 list 。

具体详情:

info line 获取当前执行代码的行号信息。

info line

info line 与 i line 等价

  • 第53行代码的起始地址是 0x5555555553b5【 main 函数的偏移量为 41 的位置】。结束地址是 0x5555555553c1【 main 函数的偏移量为 53 的位置】。即 tree3_01.c 文件中第 53 行代码在程序运行时的地址范围,从 main 函数的偏移量为 41 的位置开始,到 main 函数的偏移量为 53 的位置结束。
  • 当前程序执行到tree3_01.c 文件中第 53 行代码【未执行】。

list 查看代码内容

list

list 与 l 等价

如果没有指定参数,list 命令默认会显示当前执行位置的附近源代码。也可以指定行号或者函数名作为参数,以显示特定位置的源代码。

  • list: 显示当前执行位置周围的源代码。
  • list function_name: 显示名为 function_name 的函数的源代码。
  • list line_number: 显示指定行号的源代码。

3.2 方式二:f

在过程中,f 命令的功能是帮助了解当前执行的代码所在的位置,特别是在调试过程中出现错误时,可以帮助确认错误发生的地点。


3.3 方式三:tui模式

 按下ctrl x a会显示下图的窗口(可以上下滑动查看原代码),其中箭头表示【当前准备执行但还未执行的开始位置】。再次按下ctrl x a会退出该窗口模式。


🌼4. 查看断点信息

info b

info b 与 i b等价


🌼5. 退出函数

前面我们知道进入函数单步执行用到的gdb指令是 s

退出函数用到的gdb指令是 finish

finish

finish 不与 f等价

finish功能是退出函数

f功能是查看当前执行的位置

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

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

相关文章

WebGIS面试题(第五期)

WebGIS面试题(第五期) 以下题目仅为部分题目,全部题目在公众号{GISer世界},答案仅供参考 1、Cesium的核心组件有哪些? Cesium的核心组件包括Viewer、Scene、Model、Geometry、Material和Camera等。其中,…

Latex(从入门到入土)1

第一章:初识Latex 1、安装Latex,当然可以安装官方的开放版本,也可以去找找别人发的资源。我这里只介绍我的学习经过。如果想下载最新的软件资源,我这里推荐微信公众号:软件智库,通过号主提供的网址是可以下…

基于大数据的全国热门景点数据可视化分析系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文将介绍如何使用Python中的Pandas库进行数据挖掘,并结合Flask Web框架实现一个旅游景点数据分析系统。该系统将包括以下功能模块:热门景点概况、景点星级与评分分析、景…

Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言 记录时间 [2024-4-17] 系列文章简摘: Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备 Docker 学习笔记(七)&#x…

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性,若忽略这些因素,势必会在系统规划阶段引入次优决策风险。因此,在确定系统最佳…

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选,利用USER,排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序,不加的话会以字符排序。 -k是…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端,对外提供HTTP服务。用来处理用户登录请求…

腾讯实验室推出类似 Sora 的长视频生成Mira;阿里巴巴推出强大的代码生成模型CodeQwen1.5

✨ 1: Mira 腾讯PCG ARC实验室推出Mira:类似 Sora 的长视频生成 Mira(Mini-Sora),是一个尝试生成高质量、长时视频的初步探索项目,以Sora风格进行长视频生成。与现有的文本到视频(Text-to-Video, T2V&a…

2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题,包含高处安装、维护、拆除试题及解析答案和解析及高处安装、维护、拆除模拟试题练习。安全生产模拟考试一点通结合国家高处安装…

基于SSM+Jsp+Mysql的贝儿米幼儿教育管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK,供开发者下载和使用。 附上站点地址:Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk,简单实用~ 找到版本,点击tar.gz进…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息,Thales Imperva Bad Bot近期做了一份报告,显示在2023年有49.6%的互联网流量竟来自机器人,比上一年增长 2%,达到自2013年以来观察到的最高水平。 报告称,这一趋势正对企业组织产生负面影响&#xff0c…

Qwen1.5大语言模型微调实践

在人工智能领域,大语言模型(Large Language Model,LLM)的兴起和广泛应用,为自然语言处理(NLP)带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者,不仅拥有强大的语言生成和理…

Seata

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 1.1 Seata的三大角色 在 Seata 的架构中,一共有三个角色&#xff1…

解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障

项目场景: MSYS2 升级到 Qt6.7.0,发现显示故障,所有Qt6程序以及 QtCreator的SpinBox都显示不全,Combox的底色不对。 问题描述 2024年4月1日,pacman升级MSYS2后,Qt6遇到风格错误。如果使用官方的 Qt onlin…

C++ ─── 类和对象(拷贝构造函数)

目录 拷贝构造函数 特征 结论: 拷贝构造函数 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。 特征 拷贝构造函数也是特殊的成员函数&…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时,为了支持我的工作,不妨给一个免费的⭐Star,这将是对我最大的鼓励!感谢你的陪伴与支持!一起在技术的路上共同成长吧!点击链接:GitHub | G…

野生动物保护视频AI智能监管方案,撑起智能保护伞,守护野生动物

一、背景 在当今世界,野生动物保护已经成为全球性的重要议题。然而,由于野生动物生存环境的不断恶化以及非法狩猎等活动的盛行,保护野生动物变得尤为迫切。为了更有效地保护野生动物,利用视频智能监管技术成为一种可行的方案。 …

python读取DBF数据

DBF文件通常是由数据库软件(如FoxPro或dBASE)创建的数据库文件。Python中并没有直接读取DBF文件的内置库,但你可以使用第三方库如dbfread来读取DBF文件。 首先,你需要安装dbfread库。你可以使用pip来安装: pip insta…

数据结构——队列(C++实现)

数据结构——队列 什么是队列顺序队列链式队列实现 今天我们接着来看队列: 什么是队列 队列是一种基础且广泛应用的数据结构,它具有以下核心特征: 定义: 线性表:队列是一种特殊的线性表,其中的元素呈线…