Linux下程序调试的方法【GDB】GDB相关命令和基础操作(命令收藏)

news2024/12/26 10:28:47

目录

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进程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32f407探索者开发板(十七)——串口寄存器库函数配置方法

文章目录一、STM32串口常用寄存器和库函数1.1 常用的串口寄存器1.2 串口相关的库函数1.3 状态寄存器(USART_ SR)1.4 数据寄存器(USART_ DR)1.5 波特率寄存器(USART_BRR)二、串口配置一般步骤一、STM32串口常…

java static关键字 万字详解

目录 一、为什么需要static关键字: 二、static关键字概述 : 1.作用 : 2.使用 : 三、static修饰成员变量详解 : 1.特点 : 2.细节 : ①什么时候考虑使用static关键字? ②静态变量和非静态变量的区别? ③关于静态变量的初始化问题 : ④关于静态变…

基于springboot+vue的器官捐献系统

基于springbootvue的器官捐献系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&…

内网渗透(四十一)之横向移动篇-PsExec工具远程命令执行横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

CCNP350-401学习笔记(201-250题)

201、An engineer attempts to configure a trunk between switch SW1 and switch SW2 using DTP, but the trunk does not form. Which command should the engineer apply to switch SW2 to resolve this issue? A. switchport mode dynamic desirable B. switchport mode a…

GNU make 中文手册 第一二章 概述与介绍

一、第一章:概述 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译:把高级语言书写的代码,转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能…

小程序 npm sill idealTree buildDeps 安装一直没反应

目录 一、问题 二、解决 1、删除.npmsrc 、清除缓存 2、更换镜像源 3、最终检测 一、问题 记录:今天npm 一直安装不成功 显示:sill idealTree buildDeps 我的版本: 我百度到换镜像源安装方法,但我尝试后,依然…

CUDA性能指南

CUDA性能指南 文章目录CUDA性能指南5.1 整体性能优化策略5.2 最大化利用率5.2.1 应用程序层次5.2.2 设备层次5.2.3 多处理器层次5.2.3.1 占用率计算5.3 最大化存储吞吐量5.3.1 设备与主机之间的数据传输5.3.2 设备内存访问5.4最大化指令吞吐量5.4.1 算数指令5.4.2 控制流指令5.…

前端 ES6 环境下 require 动态引入图片以及问题

前端 ES6 环境下 require 动态引入图片以及问题require 引入图片方式打包体积对比总结ES6 环境中,通过 require 的方式引入图片很方便,一直以来也没有出过什么问题,后来项目中,需要动态引入图片。 require 动态引入也容易实现&am…

第一章 Kafka快速实战与基本原理

第一章 Kafka快速实战与基本原理 1、介绍 Kafka 是最初由 Linkedin 公司开发的,是一个分布式、支持分区的(partition)、多副本的(replica),基于 zookeeper 协调的分布式消息系统,它最大的特性就…

分布式(四)

五、分布式锁 1. 概念 1.1 本地锁 使用ReetrantLock类和synchronized关键字JDK自带的本地锁来控制一个JVM进程内的多个线程对本地共享资源的访问。 1.2 分布式锁 分布式系统下,不同的服务器/客户端通常运行在独立的JVM进程上。 多个JVM进程共享一份资源的话&…

leetcode 1~10 学习经历

LeetCode 习题 1 - 101. 两数之和2. 两数相加3. 无重复字符的最长子串4. 寻找两个正序数组的中位数5. 最长回文子串6. N 字形变换7. 整数反转8. 字符串转换整数 (atoi)9. 回文数10. 正则表达式匹配1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在…

大数据处理学习笔记1.5 掌握Scala内建控制结构

文章目录零、本讲学习目标一、条件表达式(一)语法格式(二)执行情况(三)案例演示任务1、根据输入值的不同进行判断任务2、编写Scala程序,判断奇偶性二、块表达式(一)语法格…

科学推理~

科学推理 【物理】 1、力学 重力 重力并不是指向地心的,只有赤道可以 弹力 【重点】判断弹力方向 相互作用力 摩擦力 静摩擦力 滑动摩擦力 注意:最大静摩擦力默认等于滑动摩擦力 压强 固体压强 液体压强 连通器 气体压强 气体对外做功,T 下…

1 月份 NFT 行业报告

Jan.2023, DanielData Source: NFT Monthly Report1 月是近一年来代币价格最好的一个月,ETH、BTC 和 altcoins 的涨幅是 7 月以来最猛的。自然,这导致了 NFT 行业的交易量和市值增加。一些指标是可以预测的,比如已完成的投资轮数继…

BI知识全解,值得收藏

2021年度,中国商业软件市场的增长趋势是快速增长的,达到7.8亿美元,同比增长34.9%。商业智能BI在企业应用中具有巨大的价值,并逐渐成为现代企业信息化和数字化转型的基础。所以,全面了解BI,对于企业管理是非…

100天精通Python(数据分析篇)——第76天:Pandas数据类型转换函数pd.to_numeric(参数说明+实战案例)

文章目录专栏导读一、to_numeric参数说明0. 介绍1. arg1)接收列表2)接收一维数组3)接收Series对象2. errors1)errorscoerce2)errors ignore3. downcast1)downcastinteger2)downcastsigned3&…

Spring中bean的生命周期(通俗易懂)

具体流程 bean的生命周期分4个阶段:   1.实例化   2.属性赋值   3.初始化   4.销毁 实例化就是在内存中new()出一个对象,属性赋值就是给那些被Autowired修饰的属性注入对象,销毁是在Spring容器关闭时触发,初始化的步骤比较…

隐私计算头条周刊(2.13-2.19)

开放隐私计算收录于合集#企业动态44个#周刊合辑44个#政策聚焦37个#隐私计算91个#行业研究36个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播…

【JavaEE】Servlet学后大汇总

JavaEE之Servlet一、WEB容器二、Servlet常用API和简单说明三、Servlet生命周期Servlet对象是什么时候被创建的?Servlet被称为假单例一个请求对应一个request和一个response四、Servlet属性设置——三个范围(请求、会话、应用)五、会话、过滤器…