GDB调试gdb

Linux的gdb调试 Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。Debug 版本的生成:因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。所以debug版本的体积要大一些。gcc -c hello.c -g —> 生成包含调试信息的中间文件或者。 阅读详情


quick remember

  1. 启动gdb
    在~/.gdbinit添加set auto-load safe-path /path/to/your/directory可用于指定GDB在自动加载共享库时要搜索的目录的选项,多个目录用(:)分隔。在工作目录下添加.gdbinit并将gdb启动要执行的指令添加进去
  2. 查看栈帧
    f 0 / f选择当前帧数
    f 1选择前一个帧
    f some_function
    info locals, info args查看局部变量、参数
    info frame查看当前栈上的所有栈帧
    si下一条汇编指令

gdb功能简介

    1. 启动程序,可以按照自定义的要求随心所欲的运行程序
    1. 可以让被调试的程序在所指定的断点处停住(断点可以是条件表达式)
    1. 当程序被停住时,可以检查此时程序中所发生的的事
    1. 可以改变程序,讲一个BUG产生的影响修正从而测试其他BUG

一、准备工作

  • 通常,在为调试而编译时,我们会关掉编译器的优化选项(‘-o’),并打开调试选项(‘-g’)。‘-Wall’ 在尽量不影响程序行为的情况下选项打开所有warning,也可以法相许多问题,避免一些不必要的BUG
  • gcc -g -Wall program.c -o program
  • '-g’选项的作用是在可执行文件中加入源码的信息,比如可执行文件中第几条机器指令对应源码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证 gdb 能找到源文件

二、常用命令

enter键默认执行上一次的命令

  • 启动和退出
    • gdb 可执行程序
    • quit
  • 给程序设置参数/获取设置参数
    • set args 10 20
    • show args
  • GDB使用帮助
    • help
    • 查看当前文件代码
    • list/l(从默认位置显示)
    • lsit/l 行号(从指定位置显示)
    • list/l 函数名 (从指定的函数显示)
  • 查看非当前文件代码
    • list/l 文件:行号
    • list/l 文件名:函数名
  • 设置显示的行数
    • show list/listsize
    • set list/listsize 行数

 

  • 设置断点
    • b/break 行号
    • b/break 函数名
    • b/break 文件名:行号
    • b/break 文件名:函数
  • 查看断点
    • i/info b/break
  • 删除断点
    • d/del/delete 断点编号
  • 设置断点无效
    • disable/dis 断点编号
  • 设置断点生效
    • enable/ena 断点编号
  • 设置条件断点
    • b/break 行号 if i=2

调试命令

  • 运行GDB程序
    • start(程序停在第一行)
    • run(遇到断点才停)
  • 继续运行,到下一个断点
    • c/continue
  • 向下执行一行代码(执行完函数调用进入下一行)
    • n/next
  • 向下单步调试(遇到函数进入函数体)
    • s/step
    • finish(跳出函数体)
  • 变量操作
    • p/print 变量名(打印变量值)
    • ptype 变量名 (打印变量类型)
  • 自动变量类型
    • display num(自动打印指定变量的值)
    • i/info display
    • undisplay 编号
  • 其它操作
    • set var 变量名=变量值
    • until(跳出循环)
  • 调试正在运行的程序
    • sudo gdb attach name/pid

多进程调试

gdb ./your_program
// 命令告诉GDB在fork()或vfork()系统调用之后跟踪子进程
(gdb) set follow-fork-mode child  
(gdb) run

attach pid  // 调试某个pid进程
info inferiors  // 显示子进程
inferior num  // 调试某个子进程

查看寄存器与内存

  • 查看CPU寄存器
    • info registers
  • 查看0x7c00内存的加载
    • watch *0x7c00
    • 查看当前指令 x/i ($cs * 16 + $rip)
    • 打印内存 x/16xb 0x7c00
  • 进入0x7c00代码的执行
    • b *0x7c00, c

切换src与asm

  • layout asm/src

三、调试core文件

  1. 生成core文件
sudo service apport stop
ulimit -c unlimited
  1. 运行-g生成的可执行文件
gdb exe corexxx

进入gdb后输入:
bt  可查看core,从而得知程序从何处挂掉

Time-Travel Debugging

  • record full - 开始记录
  • record stop - 结束记录
  • reverse-step/reverse-stepi

有些复杂的指令(syscall)无法保证


总结

GDB远程调试 gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。要用gdb调试程序,必须在编译时加上-g和-ggdb选项,如果没有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。 阅读详情

相关推荐

GDB c++ 调试

GDB c++ 调试程序编译1. 安装gcc (CentOS):2. 编译GDB debug1. 安装 gdb2. 进入调试环境3. 基本操作4. 设置断点 程序编译 首先,在debug之前要对程序进行编译,可以用 gcc 进行编译。 检查是否安装 gcc: rpm -qa | grep gcc 若没有gcc, 请先安装。 1. 安装gcc (CentOS): yum -y install gc...

weixin_44387066的博客 1373

GDB 调试

嵌入式 linux 应用程序 和内核 gdb 调试

weixin_44579363的博客 2万+

Mediapipe姿态估计——用坐标计算手指关节弯曲角度并实时标注

利用mediapipe搭建姿态检测模型;mediapipe人体标注节点坐标;mediapipe计算手指弯曲角度并实时渲染;mediapipe计算关节弯曲角度。mediapipe手势识别;mediapipe姿态检测模型;mediapipe学习。

kalakalabala的博客 1万+

GDB调试

简单常用gdb命令的学习实操

weixin_44628585的博客 1万+

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3501

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 363

手把手教你使用gdb调试器

Linux下gdb调试器的使用

m0_55752775的博客 1万+

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

手把手带你学会使用GDB进行调试

讲解GDB最常用的一些方法,使用例子带你学会使用GDB!

记录一位C++爱好者的笔记 6380

上位机 寻边器 通讯实战

寻边器通讯接口实现 本文介绍了上位机与盖泽(Gazer)和JEL品牌寻边器的通讯接口实现方案。主要内容包括: 接口定义:创建了IAlignerOperation接口,定义了获取状态、控制运动、真空吸附等核心功能。 具体实现: 盖泽寻边器(GazerAlignerCjh):通过串口通讯,实现了回零、校准、移动位置等操作 JEL寻边器(JelAligner):同样基于串口通讯,包含错误处理、状态查询等功能 工厂模式:通过AlignerFactory工厂类根据设备品牌创建对应的实现对象。 设备加载:展示了如何在系

StevenChen的博客 378

【uniapp踩坑记】App Store上传失败:Invalid Swift Support错误怎么解决?

作为一个前端出身的开发者,用 uniapp 开发原生 App 已经够挑战了,打包 iOS 上传 App Store 更是处处暗雷。这次的坑虽然小,但确实容易忽略。如果你也遇到了类似的报错,希望这篇文章能帮你少踩一次坑!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1143

GDB调试命令详解

GDB是什么 调试程序 程序中出现的语法错误可以借助编译器解决;但逻辑错误则只能靠自己解决。实际场景中解决逻辑错误最高效的方法,就是借助调试工具对程序进行调试。 所谓调试(Debug),就是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。 也就是说,通过调试程序,我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低

Hello World 9万+

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6124

gdb调试详解

一、gdb调试coredump文件 二、gdb调试多线程       【Note】:

青萍之末的博客 1万+

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。

jundao1997的专栏 566

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何使用GDB调试

文章目录一、GDB的介绍二、GDB的使用三、使用GDB调试实际例子 一、GDB的介绍 GDB(全称:GNU Debugger)是GNU工程为GNU操作系统开发的调试器。它可以用于调试C、C++、Objective-C、Pascal、Ada等语言编写的程序。 二、GDB的使用 GDB的使用条件 程序要用GDB调试,需要添加调试信息。 添加方法: gcc的-g选项为程序添加调试信息。 例如:gcc –g –o helloworld helloworld.c 启动GDB 启动方法: gdb [程序名称

Harriet的博客 6558

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

gdb调试小结

一、启动 1、gdb 2、调试在线进程 (1)启动gdb时链接目标进程 (2)gdb中链接目标进程: (3)断开链接: 二、信息显示 1、栈信息 2、变量 3、寄存器 4、内存 5、源代码 6、显示格式 三、断点 1、设置断点 2、 查看、删除断点 3、设置无效、有效断点: 4、条件断点 5、监视点 6、断点命令 四、其他 1、强制函数返回 2、强制调用函数 参考 ...

milletluo的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++调试@认识GDB调试

GDB(GNU Debugger)是Linux及Unix环境中常用的程序调试工具,windows 下也有许多移植版可以用深入理解程序执行:GDB命令行提供了对程序执行流程的底层控制,帮助你更深入地理解程序的运行机制。通过手动控制每一步执行,你能够更细致地观察变量变化、函数调用、内存状态等,这对于复杂问题的排查非常有帮助。轻量级和灵活性:相比IDE,GDB是一个轻量级工具,尤其适合远程服务器或资源受限环境下的调试。

xuchaoxin1375的博客 1368

gdb调试总结

在 root用户下,就在/root目录, 在 home用户下就在/home目录下,定义一个.gdbinit文件即可,不存在可以新建一个。然后在文件里面写上gdb命令Apache Web Server 源码为例,源码目录里面有一个.gdbinit文件set $i = 0elseendendend# 省略部分代码。

u010185392的博客 1491

GDB调试大全

GDB详细调试大全

m0_60524373的博客 4127

gdb调试

命令名称命令缩写命令说明runr运行一个程序continuec让暂停的程序继续运行nextn运行到下一行steps如果有调用函数,进入调用的函数内部(相当于step intountilu运行到指定行停下来finishfi结束当前调用函数,到上一层函数调用处returnreturn结束当前调用函数并返回指定值,到上一层函数调用处jumpj将当前程序执行流跳转到指定行或地址printp打印变量或寄存器值backtracebt查看当前线程的调用堆栈。

m0_74186706的博客 2754

GDB调试命令

GDB是Linux下常用的程序调试工具,主要用于排查语法和逻辑错误。

weixin_45888613的博客 903
上一篇: C/C++混用情况解决 编译问题
下一篇: 操作系统概述(一、并发)
耶耶耶耶耶~
博客等级 码龄9年 943粉丝 153原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值