当前位置: 首页 > news >正文

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上设置断点
b function---    此命令用来在某个函数上设置断点,在进入指定函数时停住
b linenum---    在行号为linenum的行上设置断点。程序在运行到此行之前停止
b +offset/b -offset---    在当前程序运行到的前几行或后几行设置断点。offset为行号
b filename:linenum---   在文件名为filename的原文件的第linenum行设置断点
b filename:function---    在文件名为filename的原文件的名为function的函数上设置断点。当你的多个文件中可能含有相同的函数名时必须给出文件名

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 expfmt为以下值
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工作原理 服务端运行&#xf…...

简述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、参考源码及实验数据集一、理论基础 小波神经网络&#xff08…...

商标干货!所有企业都值得收藏!

商标,是用于识别和区分不同商品或服务来源的标志,代表了企业的产品质量和服务保证,可以说,商标承载了一个企业的信誉,是企业参与市场竞争的重要工具,对于企业及其产品的重要性不言而喻。 根据《商标法》四十…...

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…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

大模型智能体核心技术:CoT与ReAct深度解析

**导读:**在当今AI技术快速发展的背景下,大模型的推理能力和可解释性成为业界关注的焦点。本文深入解析了两项核心技术:CoT(思维链)和ReAct(推理与行动),这两种方法正在重新定义大模…...

触发DMA传输错误中断问题排查

在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...

【计算机网络】SDN

SDN这种新型网络体系结构的核心思想:把网络的控制层面与数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。 OpenFlow协议可以被看成是SDN体系结构中控制层面与数据层面之间的通信接口。 在SDN中取代传统路由器中转发表的是“流表”&…...

成工fpga(知识星球号)——精品来袭

(如需要相关的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!) 《孩子都能学会的FPGA》系列是成工完成的第一个系列,也有一年多的时…...