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…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
