Linux下程序调试的方法【GDB】GDB相关命令和基础操作(命令收藏)
目录
1、编译
2、启动gdb调试
2.1 直接运行
2.2 运行gdb后使用run命令
2.3 调试已运行的程序
3、图形界面提示
4、调试命令
1、查看源码
2、运⾏程序/查看运⾏信息
3、设置断点
5、单步/跳步执⾏
6、分割窗口
7、其他命令
8、相关参数
1、编译
在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试。
-g选项的作用是在可执行文件中加入源代码的倍息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
g也是分级别的,-g分4个等级:
选项 | 解析 |
---|---|
g0 | 等于不加-g;即不包含任何信息 |
g1 | 级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用。回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到的调试手段 |
g2 | 这是默认的级别,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息 |
g3 | 包含级别2中的所有调试信息,以及源代码中定义的宏 |
首先用 gcc 对代码进行编译,生成可执行文件 test
$ gcc test.c -g -o test
2、启动gdb调试
GDB 主要有3种调试功能:
gdb program:使用GDB 开始执行被调试程序program,可通过GDB 命令控制program 的行为;
gdb program core:使用GDB 同时执行被调试程序program 和core 文件(程序异常中止或退出时,保存的内存映像加调试信息文件,包含程序当前的内存、寄存器、堆栈等信息),便于定位分析程序异常中止或退出的原因;
gdb attach PID (gdb -p PID):使用GDB 接管(attach)一个正在运行的被调试程序,PID 为被调试程序的process-ID(可通过pidof program 查看),可通过GDB 命令控制program 的行为。
2.1 直接运行
gdb test//最常用的用gdb启动程序,开始调试的方式gdb test core //用gdb查看core dump文件,跟踪程序core的原因gdb --args test arg1 arg2//带参数的程序调试
2.2 运行gdb后使用run命令
//无参数
gdb test
run
//参数
gdb test
run arg1 arg2
2.3 调试已运行的程序
sudo gdb program pid //用gdb调试已经开始运行的程序,指定pid即可
sudo gdb attach pid //用gdb调试已经开始运行的程序,指定pid即可
3、图形界面提示
将上述命令的gdb换成gdbtui会显示出图形提示界面
输入:
gdbtui mytest
显示出在第9行打了断点
4、调试命令
1、查看源码
list(简写l) | 查看程序源代码,默认显⽰10⾏,回车翻页 |
ist ⾏号 | 将显⽰当前⽂件以“⾏号”为中⼼的前后10⾏代码,如,list 12 |
list 函数名 | 将显⽰“函数名”所在函数的源代码,如,list main |
list | 不带参数,将接着上⼀次 list 命令的,输出下边的内容 |
2、运⾏程序/查看运⾏信息
run(简写r) | 运⾏程序直到遇到 结束或者遇到断点等待下⼀个命令 |
where/bt | 当前运⾏的堆栈列表 |
bt backtrace | 显⽰当前调⽤堆栈 |
up/down | 改变堆栈显⽰的深度 |
set args | 指定运⾏时的参数 |
show args | 查看设置好的参数 |
info program | 来查看程序的是否在运⾏,进程号,被暂停的原因 |
i breakpoint | 显示当前断点列表 |
i reg[ister] | 显示寄存器信息 |
i threads | 显示线程信息 |
i func | 显示所有的函数名 |
i local | 显示当前函数的所有局部变量的信息 |
i prog | 显示调试程序的执行状态 |
i watch exp | 为表达式(变量)exp设置一个观察点。一但表达式值有变化时,马上停住程序。 |
i proc | 显示进程的概要信息 |
info proc mappings | 报告你进程所能访问的地址范围。 |
info proc times | 你进程和子进程的开始时间,用户时间(user CPU time),和系统CPU时间。 |
info proc id | 报告有关进程id的信息 |
info proc status | 报告你进程的一般状态信息。如果进程停止了。这个报告还包括停止的原因和收到的信号 |
info proc all | 显示上面proc命令这些命令返回的所有信息 |
其他info命令
info thread | 列出线程 |
info register | 列出寄存器 |
info frame | 列出栈帧 |
info files | 列出当前文件 |
info share | 列出当前共享库 |
i breakpoint | 显示当前断点列表 |
i reg[ister] | 显示寄存器信息 |
i threads | 显示线程信息 |
i func | 显示所有的函数名 |
i local | 显示当前函数的所有局部变量的信息 |
i prog | 显示调试程序的执行状态 |
i watch exp | 为表达式(变量)exp设置一个观察点。一但表达式值有变化时,马上停住程序。 |
i proc | 显示进程的概要信息 |
info proc mappings | 报告你进程所能访问的地址范围。 |
info proc times | 你进程和子进程的开始时间,用户时间(user CPU time),和系统CPU时间。 |
info proc id | 报告有关进程id的信息 |
info proc status | 报告你进程的一般状态信息。如果进程停止了。这个报告还包括停止的原因和收到的信号 |
info proc all | 显示上面proc命令这些命令返回的所有信息 |
3、设置断点
break(简写b) | b ⾏号--- 在某⾏设置断点 b address--- 在地址address上设置断点 break--- break命令没有参数时,表示在下一条指令处停住。 |
info breakpoints | 显⽰断点信息 |
b fn1 if a>b | 条件断点设置 |
break func(break缩写为b) | 在函数func()的⼊⼝处设置断点,如break cb_button |
delete 断点号n | 删除第n个断点 |
disable 断点号n | 暂停第n个断点 |
enable 断点号n | 开启第n个断点 |
clear ⾏号n | 清除第n⾏的断点 |
delete breakpoints | 清除所有断点 |
删除所有断点 | (gdb) delete |
Num | 断点编号 |
Disp | 断点执⾏⼀次之后是否有效 kep:有效 dis :⽆效 |
Enb | 当前断点是否有效 |
Address | 内存地址 |
What | 位置 |
5、单步/跳步执⾏
使⽤ continue、step、next命令
continue(简写 c) | 继续执⾏程序,直到下⼀个断点或者结束; |
next(简写 n ) | 单步执⾏程序,但是遇到函数时会直接跳过函数,不进⼊函数; |
step(简写 s) | 单步执⾏程序,但是遇到函数会进⼊函数; s [n] --- n为步进次数。如果调用了某个函数,会跳入函数内部。 |
until | 当你厌倦了在⼀个循环体内单步跟踪时,这个命令可以运⾏程序直到退出循环体; |
until+⾏号 | 运⾏⾄某⾏,不仅仅⽤来跳出循环; |
finish | 运⾏程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息; |
6、查看变量
使⽤print、whatis命令
print 表达式 | 简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,⽐如当前正在调试C语⾔的程序,那么“表达式”可以是任何C语⾔的有效表达式,包括数字,变量甚⾄是函数调⽤。 |
p/fmt exp | fmt为以下值 x 十六进制 d 十进制 u 无符号数 o 八进制 t 二进制 a 十六进制打印 c 字符格式 f 浮点数 |
print a | 将显⽰整数 a 的值 |
print ++a | 将把 a 中的值加1,并显⽰出来 |
print name | 将显⽰字符串 name 的值 |
print gdb_test(22) | 将以整数22作为参数调⽤ gdb_test() 函数 |
print gdb_test(a) | 将以变量 a 作为参数调⽤ gdb_test() 函数 |
display 表达式 | 在单步运⾏时将⾮常有⽤,使⽤display命令设置⼀个表达式后,它将在每次单步进⾏指令后,紧接着输出被设置的表达式及值。如display a |
watch 表达式 | 设置⼀个监视点,⼀旦被监视的“表达式”的值改变,gdb将强⾏终⽌正在被调试的程序。如watch a |
whatis | 查询变量或函数 |
info function | 查询函数 |
info locals | 显⽰当前堆栈页的所有变量 |
call 函数(参数) | 调⽤程序中可见的函数,并传递“参数”,如,call gdb_test(55); |
6、分割窗口
layout | ⽤于分割窗⼝,可以⼀边查看代码,⼀边测试 |
layout src | 显⽰源代码窗⼝ |
layout asm | 显⽰反汇编窗⼝ |
layout regs | 显⽰源代码/反汇编和CPU寄存器窗⼝ |
layout split | 显⽰源代码和反汇编窗⼝ |
Ctrl + L | 刷新窗⼝ |
7、其他命令
命令 | 描述 |
---|---|
file [filename] | 装入想要调试的可执行文件 |
kill [filename] | 终止正在调试的程序 |
break [file:]function | 在(file文件的)function函数中设置一个断点 |
clear | 删除一个断点,这个命令需要指定代码行或者函数名作为参数 |
run [arglist] | 运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序) |
bt Backtrace: | 显示程序堆栈信息 |
print expr | 打印表达式的值 |
continue | 继续运行您的程序 (在停止之后,比如在一个断点之后) |
list | 列出产生执行文件的源代码的一部分 |
next | 单步执行 (在停止之后); 跳过函数调用 |
nexti | 执行下一行的源代码中的一条汇编指令 |
set | 设置变量的值。例如:set nval=54 将把54保存到nval变量中 |
step | 单步执行 (在停止之后); 进入函数调用 |
stepi | 继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码 |
watch | 使你能监视一个变量的值而不管它何时被改变 |
rwatch | 指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令 |
awatch | 指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令 |
Ctrl-C | 在当前位置停止执行正在执行的程序,断点在当前行 |
disable | 禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数 |
display | 在断点的停止的地方,显示指定的表达式的值。(显示变量) |
undisplay | 删除一个display设置的变量显示。这个命令需要将display list中的索引做参数 |
enable | 允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数 |
finish | 继续执行,直到当前函数返回 |
ignore | 忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断 |
info [name] | 查看name信息 |
load | 动态载入一个可执行文件到调试器 |
xbreak | 在当前函数的退出的点上设置一个断点 |
whatis | 显示变量的值和类型 |
ptype | 显示变量的类型 |
return | 强制从当前函数返回 |
txbreak | 在当前函数的退出的点上设置一个临时的断点(只可使用一次) |
make | 使你能不退出 gdb 就可以重新产生可执行文件 |
shell | 使你能不离开 gdb 就执行 UNIX shell 命令 |
help [name] | 显示GDB命令的信息,或者显示如何使用GDB的总体信息 |
quit | 退出gdb |
8、相关参数
参数 | 解析 |
---|---|
gdb -e | 指定可执行文件名 |
gdb -c | 指定coredump文件 |
gdb -d | 指定目录加入到源文件搜索路径 |
gdb –cd | 指定目录作为路径运行gdb |
gdb -s | 指定文件读取符号表 |
gdb -p | 指定attach进程 |
相关文章:

Linux下程序调试的方法【GDB】GDB相关命令和基础操作(命令收藏)
目录 1、编译 2、启动gdb调试 2.1 直接运行 2.2 运行gdb后使用run命令 2.3 调试已运行的程序 3、图形界面提示 4、调试命令 1、查看源码 2、运⾏程序/查看运⾏信息 3、设置断点 5、单步/跳步执⾏ 6、分割窗口 7、其他命令 8、相关参数 1、编译 在编译时要加上-g选…...

使用frp配置内网机器访问
frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。frp 项目官网是 https://github.com/fatedier/frp,软件下载地址为https://github.com/fatedier/frp/releases frp工作原理 服务端运行…...
简述7个流行的强化学习算法及代码实现!
目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。1、Q-learningQ-learning:Q-…...
朗润国际期货招商:地方政府工作报告中对于促进消费
地方政府工作报告中对于促进消费 北京:把恢复和扩大消费摆在优先位置。加紧推进国际消费中心城市建设、深化商圈改造提升行动、统筹推进物流基地规划建设,强化新消费地标载体建设、试点建设80个“一刻钟便民生活圈”,提高生活性服务重品质。…...

前端性能优化的一些技巧(90% chatGpt生成)
终于弄好了chatGpt的账号,赶紧来体验一波。先来一波结论,这篇文章的主要内容来源,90%是用chatGpt生成的。先上chatGpt的生成的结果:作为一名懒惰的程序员,chatGpt会帮助我变得更懒...,好了下面开始文章的正…...

[软件工程导论(第六版)]第8章 维护(复习笔记)
文章目录8.1 软件维护的定义8.2 软件维护的特点8.3 软件维护过程8.4 软件的可维护性8.5 预防性维护8.6 软件再工程过程维护的基本任务:保证软件在一个相当长的时期能够正常运行软件工程的主要目的就是要提高软件的可维护性,减少软件维护所需要的工作量&a…...

Python - 绘制人体生物节律
文章目录项目说明关于人体生物节律用到的技术代码实现获取每月有多少天计算每天到生日过了多少天计算节律绘图结果项目说明 这里仿照 http://www.4qx.net/The_Human_Body_Clock.php 做一个人体生物节律的计算和展示 关于人体生物节律 百度/维基百科 解释 https://zh.wikiped…...

【NVMEM子系统】二、NVMEM驱动框架
个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、前言2、驱动框架3、源码目录结构4、用户空间下的目录结构1、前言 NVMEM SUBSYSTEM,该子系…...

小波神经网络(WNN)的实现(Python,附源码及数据集)
文章目录一、理论基础1、小波神经网络结构2、前向传播过程3、反向传播过程4、建模步骤二、小波神经网络的实现1、训练过程(WNN.py)2、测试过程(test.py)3、测试结果4、参考源码及实验数据集一、理论基础 小波神经网络(…...
商标干货!所有企业都值得收藏!
商标,是用于识别和区分不同商品或服务来源的标志,代表了企业的产品质量和服务保证,可以说,商标承载了一个企业的信誉,是企业参与市场竞争的重要工具,对于企业及其产品的重要性不言而喻。 根据《商标法》四十…...

4次迭代,让我的 Client 优化 100倍!泄漏一个 人人可用的极品方案!
4次迭代,让我的HttpClient提速100倍 在大家的生产项目中,经常需要通过Client组件(HttpClient/OkHttp/JDK Connection)调用第三方接口。 尼恩的一个生产项目也不例外。 在一个高并发的中台生产项目中。有一个比较特殊的请求,一次…...

并查集(高级数据结构)-蓝桥杯
一、并查集并查集(Disioint Set):一种非常精巧而实用的数据结构用于处理不相交集合的合并问题。用于处理不相交集合的合并问题。经典应用:连通子图。最小生成树Kruskal算法。最近公共祖先。二、应用场景有n个人,他们属于不同的帮派。 已知这些…...

你是真的“C”——C语言详解求两个正数最小公倍数的3种境界
C语言详解求两个正数最小公倍数的3种境界~😎前言🙌必备小知识~😘求最小公倍数境界1~ 😊求最小公倍数境界2~ 😊求最小公倍数境界3~ 😊总结撒花💞博客昵称:博客小梦😊 最喜…...
【java】Spring Cloud --Feign Client超时时间配置以及单独给某接口设置超时时间方法
文章目录feign配置(最常用)ribbon配置hystrix配置单独给某接口设置超时时间FeignClient面对服务级有三种超时时间配置feign配置(最常用) feign:sentinel:enabled: trueclient:config:default://全部服务配置connectTimeout: 5000…...
spark代码
RDD Tom,DataBase,80 Tom,Algorithm,50 Tom,DataStructure,60 Jim,DataBase,90 Jim,Algorithm,60 Jim,DataStructure,80 该系总共有多少学生; val lines sc.textFile("file:///usr/local/spark/sparksqldata/Data01.txt") val par lines.map(ro…...

利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理
如果一幅图像的灰度值集中在某个比较窄的区域,则图像的对比度会显得比较小,不便于对图像的分析和处理。 图像的直方图均衡化可以实现将原图像的灰度值范围扩大,这样图像的对比度就得到了提高,从而方便对图像进行后续的分析和处理…...
星河智联Android开发
背景:朋友内推,过了一周约面。本人 2019年毕业 20230208一面 1.自我介绍 2.为啥换工作 3.项目经历(中控面板、智能音箱、语音问的比较细) 4.问题 Handler机制原理?了解同步和异步消息吗?View事件分发…...

【C++】关联式容器——map和set的使用
文章目录一、关联式容器二、键值对三、树形结构的关联式容器1.set2.multiset3.map4.multimap四、题目练习一、关联式容器 序列式容器📕:已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为…...
Promise的实现原理
作用:异步问题同步化解决方案,解决回调地狱、链式操作原理: 状态:pending、fufilled reject构造函数传入一个函数,resolve进入then,reject进入catch静态方法:resolve reject all any react ne…...

【MFC】数据库操作——ODBC(20)
ODBC:开放式数据库连接,是为解决异构数据库(不同数据库采用的数据存储方法不同)共享而产生的。ODBC API相对来说非常复杂,这里介绍MFC的ODBC类。 添加ODBC用户DSN 首先,在计算机中添加用户DSN:(WIN10下&a…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...