GDB调试助手用法详解

什么是GDB

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

实战:GDB 调试程序

编写GDB 调试程序:

myMath.h

int add(int a, int b);
int reduce(int a, int b);
int multipy(int a, int b);
int devide(int a, int b);

myMath.c

#include "myMath.h"
int add(int a, int b){return a + b;
}int reduce(int a, int b){return a - b > 0 ? a - b : 0;
}int multipy(int a, int b){return a * b;
} 
int devide(int a, int b){return a/b;
}

本文采用静态库的方式编译:

编译库文件:使用编译器进行编译,将库文件编译成目标文件。
gcc -c myMath.c -o myMath.o创建静态库:将目标文件打包成静态库文件。
ar rcs libmyMath.a myMath.o          语法:ar rcs lib静态库文件.a  编译库文件创建可执行文件,并引入自定义静态库
gcc myMathDemo.c -o myMathDemo -L. -lmyMath       语法: gcc 源代码.c -o 可执行文件名称 -L. -l自定义静态库可执行效果:
wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ ./myMathDemo
请输入两个整数:
21 3
输入a: 21, b: 3
add is value:24
reduce is value:18
multipy is value:63
devide is value:7

GDB 调试步骤重点说明:

第一步:启动gdb 调试 myMathDemo 程序

1、首先确认Ubuntu 已经安装gdb,否则执行如下命令:
sudo apt-get install gdb2、创建调试可执行文件
gcc myMathDemo.c -g -o myMathDemo -L. -lmyMath     //基于自定义函数文件, 添加调试参数 -g3、启动GDB, 调试可执行文件 myMathDemo
gdb ./myMathDemo

第二步:设置断点

 break 6  //基于代码行号设置断点

第三步:运行至指定断点

 run

第四步:执行单步调试

 next

第五步:输出变量值

 print aprint b 

第六步:程序继续执行

 continue

第七步:退出

q

常见指令说明:

  • next:执行下一行代码。

  • step:单步执行,如果遇到函数调用会进入该函数内部。

  • print <variable>:打印变量的值。

  • continue:继续程序的执行。

  • backtrace:显示当前函数调用栈。

GDB 调试程序控制台命令输出

wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ gcc myMathDemo.c -g -o myMathDemo -L. -lmyMath
wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ gdb ./myMathDemo
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.1) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
--Type <RET> for more, q to quit, c to continue without paging--
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./myMathDemo...
(gdb) break 6
Breakpoint 1 at 0x11c4: file myMathDemo.c, line 6.
(gdb) run
Starting program: /mnt/e/ubuntu_code/myMathDemo
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".Breakpoint 1, main () at myMathDemo.c:6
6           printf("请输入两个整数:\n");
(gdb) print a
$1 = 4096
(gdb) print b
$2 = 0
(gdb) next
请输入两个整数:
7           scanf("%d%d", &a, &b);
(gdb) next
21 3
8           printf("输入a: %d, b: %d\n", a, b);
(gdb) print a
$3 = 21
(gdb) print b
$4 = 3
(gdb) backtrace
#0  main () at myMathDemo.c:8
(gdb) continue
Continuing.
输入a: 21, b: 3
add is value:24
reduce is value:18
multipy is value:63
devide is value:7
[Inferior 1 (process 11204) exited normally]
(gdb) q

GDB使用手册

启动 GDB

要启动 GDB 并调试一个程序,可以使用以下命令:

gdb program_name

这将启动 GDB 并加载 program_name 程序,准备开始调试。

基本命令

  • run:运行程序。
  • break file_name:line_number:在指定文件和行设置断点。
  • break function_name:在指定函数设置断点。
  • continue:继续程序执行。
  • next:单步执行下一行代码。
  • step:单步进入函数调用。
  • print variable_name:输出变量的值。
  • quit:退出 GDB。

查看信息

  • bt:打印函数调用栈。
  • info locals:显示当前栈帧的本地变量。
  • info breakpoints:显示所有断点信息。
  • info registers:显示寄存器内容。

调试技巧

  • 在 GDB 中可以输入表达式进行计算,例如 print 5 + 3
  • 使用 display expression 命令可以持续显示表达式的值。
  • 使用 info breakpoints 命令可以查看当前设置的所有断点。
  • 使用 record 和 reverse-stepreverse-continue 等命令进行逆向调试。

源码与汇编码

  • layout src:显示源代码窗口。
  • layout asm:显示汇编码窗口。
  • layout regs:显示寄存器窗口。

调试程序运行中的问题

  • 在程序运行中遇到问题时,可以随时中断程序执行,使用 Ctrl+C 来中断程序,然后可以使用 GDB 进行调试。

退出 GDB

要退出 GDB,可以使用 quit 命令。

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

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

相关文章

朗科HD10M2Pr震撼上市,自带风扇极速降温,匹敌私有云

近日,存储领域的领军企业朗科旗下全资子公司朗科创新宣布,其最新款磁吸硬盘盒HD10M2Pr正式上市。这款产品凭借超薄设计、极速降温、高速传输等多项优势,迅速成为了行业内的讨论焦点。 随着移动设备使用的普及和短视频内容的日益丰富,对于存储空间不断增长的需求逐渐成为日常生活…

liquibase 错误: 无法打开扩展控制文件 “c:/postgresql/14/share/extension/timescaledb.control“

背景 运行springboot项目时&#xff0c;在一开始运行liquibase部分报错&#xff0c;报错信息如题所示&#xff0c;经查&#xff0c;是因为安装postgresql时没有安装这个名为timescaledb的扩展&#xff0c;所以接下来就是安装timescaledb扩展。 安装timescaledb扩展 我的电脑…

Semaphroe + CountDown

Semaphore 基本使用 synchronized 可以起到锁的作用&#xff0c;但某个时间段内&#xff0c;只能有一个线程允许执行 Semaphore&#xff08;信号量&#xff09;用来限制能同时访问共享资源的线程上限&#xff08;不是资源数&#xff09;&#xff0c;非重入锁 不像之前的reen…

rsync同步目录脚本

假设有两台服务器的示例 IP 地址为&#xff1a; Server A: 192.168.1.100Server B: 192.168.1.200 现在来解释如何使用这个脚本进行服务器之间文件夹内容的同步&#xff0c;保留路径和服务器信息的抽象化。 1. 脚本文件位置和权限 假设脚本文件位于 /root/script.sh&#x…

Hadoop面试题总结

一 、介绍一下hadoop 综述:hadoop是一个适合海量数据的分布式存储和分布式计算的平台 分述:hadoop包含三大组件&#xff0c;分别是HDFS、MapReduce和YARN --HDFS(分布式文件系统) HDFS集群由NameNode,DataNode,SecondaryNameNode构成NameNode&#xff1a;主要负责接受用户请求…

XML 应用程序

XML 应用程序 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它是一种自我描述的语言&#xff0c;允许用户定义自己的标签和文档结构。XML广泛应用于各种应用程序中&#xff0c;包括网站开发、数据交换、文档管理等。本文将探讨XML的一些主要…

导入导出带下拉框模版(EasyExcel)

前言 项目进行到新的一个迭代了&#xff0c;赶了1周需求&#xff0c;接口终于处理完了。分享记录下迭代中处理导入、导出、下载模版功能的细节吧。 一、场景 EasyExcel&#xff08;阿里&#xff09;实现Excel数据处理三层表头&#xff0c;第二、三层表头动态数据根据第二、三层…

RabbitMQ(六)仲裁队列、流式队列、异地容灾(联邦队列Federation Queue)

文章目录 仲裁队列1、创建交换机2、创建仲裁队列3、验证主节点宕机不影响消息发送和接收 流式队列&#xff08;不推荐&#xff0c;Kafka主场&#xff09;概念 异地容灾一、Federation插件概述 二、Federation交换机1、总体说明2、准备工作3、启用联邦插件4、添加上游连接端点5、…

NetSuite Inventory Transfer Export Saved Search

用户之前有提出一个实际的需求&#xff0c;大致意思是想要导出Inventory Transfer的相关明细行信息&#xff0c;且要包含From Location&#xff0c;To Location&#xff0c;Quantity等信息。 我们知道From Location和To Location在IT Form中应该是在Main的部分&#xff0c;在D…

java学习--集合(大写一.1)

看尚硅谷视频做的笔记 1.集合框架概述 1.1生活中的容器 首先知道集合是来解决什么问题的&#xff1f; 1.1.1内存层面需要针对于多个数据进行存储&#xff0c;此时&#xff0c;可以考虑的容器有&#xff1a;数组、集合类 对于内存层面的来说&#xff0c;断电后数据就不复存…

后端学习笔记:Python基础

后端学习笔记&#xff1a;Python基础 数据类型&#xff1a; Python中主要有以下几种常用的基本数据类型&#xff1a; String 字符串类型&#xff0c;用单引号或者双引号引用Number 数字类型&#xff0c;包括浮点数&#xff0c;整数&#xff0c;长整数和复数List 列表项&…

Python polars学习-06 Lazy / Eager API

背景 polars学习系列文章&#xff0c;第6篇 Lazy / Eager API Lazy&#xff1a; 延迟、惰性 Eager&#xff1a; 即时、实时 该系列文章会分享到github&#xff0c;大家可以去下载jupyter文件&#xff0c;进行参考学习 仓库地址&#xff1a;https://github.com/DataShare-duo/…

界面构件开发之RC文件

代码; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);gtk_rc_parse("./mainrc");GtkWidget *winN…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续字母长度(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

某棋牌渗透测试

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、信息收集 这里通过fofa进行收集&#xff0c;语法为&#xff1a;body某棋牌 && titlexxx 图1-1 fofa资产收集 …

Human4DiT:使用 4D Diffusion Transformer 生成自由视角人物视频。

Human4DiT&#xff0c;使用 4D Diffusion Transformer 生成自由视角人物视频。又一个根据一张图&#xff0c;生成人物动画视频的项目&#xff0c;效果如下视频所示。 给定参考图像、SMPL序列和摄像机参数&#xff0c;Human4DiT能够生成自由视图动态人体视频。 相关链接 项目地…

Ubuntu根分区在线扩容

操作系统:Ubuntu 20.04 原有分区 /dev/sda2 大小8G,扩容后 /dev/sda2 大小100G 1. 扩容前信息 系统盘为/dev/vda,共有2个分区,/dev/sda1为启动分区,/dev/sda2为根分区 root@test:~# fdisk -l /dev/sda Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors Disk …

神经网络模型---LeNet-5

一、LeNet-5 1.定义LeNet-5模型 model models.Sequential([1.1添加一个二维卷积层&#xff0c;有6个过滤器&#xff0c;每个过滤器的尺寸是5x5。输入图像尺寸是28x28像素&#xff0c;具有1个颜色通道,激活函数是relu layers.Conv2D(6, (5, 5), activationrelu, input_shape…

【Codesys】-计算开机通电运行时间,累计正常使用时间,故障停机时间

应客户要求&#xff0c;在程序添加了这个用来计算开机运行时间&#xff0c;原理就是取当前时间减去一开始记录的时间&#xff0c;没什么特别要求&#xff0c;记录一下使用的变量类型和数据写法&#xff0c;防止忘记了。 下文只写了一个开机通电运行时间的写法&#xff0c;累计…

ROS操作过程中的报错

文章目录 错误&#xff1a;E: Unable to locate package ros-noetic-desktop-full报错问题报错原因解决方法 错误2&#xff1a;ERROR: cannot download default source list from:报错问题错误原因解决办法 错误&#xff1a;E: Unable to locate package ros-noetic-desktop-fu…