C/C++调试工具 - gdb详解
C/C++调试工具 -gdb详解
- 1 简介
- 2 常用的命令
- 3 使用的条件
- 4 程序调试
- 4.1 直接运行程序
- 4.2 断点调试(在某一行)
- 4.3 断点调试(在函数入口处打断点)
- 5 调试core文件
- 5.1 生成core文件的方法
- 5.2 调试core文件
1 简介
GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言,是做后端软件开发必备的工具
可以完成如下的功能 :
- 1 按照自定义的方式启动运行需要调试的程序
- 2 程序暂停时的值的监视
- 动态改变程序的执行环境
2 常用的命令
| 命令 | 详解 |
|---|---|
| file filename | 加载被调试的可执行文件 |
| run | 重新开始运行文件 |
| start | 单步执行 运行程序 停在第一执行语句 |
| list | 查看源代码 |
| set | 设置变量的值 |
| start | 单步执行 运行程序 停在第一执行语句 |
| next | 单步跳过(直接执行函数) |
| step | 单步执行 进入函数内部执行 |
| backtrace | 查看函数的调用栈帧和层级关系(简写bt) |
| frame | 切换的函数的栈帧 |
| info | 查看函数内部局部变量的值 |
| finish | 结束当前函数 回到函数的调用点 |
| continue | 继续执行 简写c |
| 打印值及地址 简写p | |
| quit | 退出gdb |
3 使用的条件
在编译时使用 g++/gcc -g选项
查看是否带有编译信息

如上所示则表示带有调试信息

如上所示,则表示编译时没有带 -g选项 因此无法是gdb进行调试
4 程序调试
4.1 直接运行程序
使用gdb工具运行的代码如下
#include <stdio.h>
int main()
{int index = 0;for (;index < 10;++index){printf("index = %d ",index);}printf("\n");return 0;
}
编译
gcc -g test.c -o test
gdb 运行
[root@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
## run 运行
(gdb) run
Starting program: /home/vagrant/clan/test/test
index = 0 index = 1 index = 2 index = 3 index = 4 index = 5 index = 6 index = 7 index = 8 index = 9
[Inferior 1 (process 12553) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
4.2 断点调试(在某一行)
1 在某一行打断点
格式:
## 简写 b filename:rownum
break filename:rownum
2 继续运行
## 简写 c
continue
输出变量的值
print varname
[root@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.## 1 加载可执行文件
(gdb) file test
Load new symbol table from "/home/vagrant/clan/test/test"? (y or n) y
Reading symbols from /home/vagrant/clan/test/test...done.## 2 在test.c文件的第7行打断点
(gdb) b test.c:7
Breakpoint 1 at 0x40058e: file test.c, line 7.## 3 运行程序
(gdb) r
Starting program: /home/vagrant/clan/test/testBreakpoint 1, main () at test.c:7
7 printf("index = %d ",index);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64##4 输出变量的值
(gdb) print index
$1 = 0##5 继续允许程序
(gdb) c
Continuing.Breakpoint 1, main () at test.c:7
7 printf("index = %d ",index);
(gdb) print index
$2 = 1
(gdb) c
Continuing.Breakpoint 1, main () at test.c:7
7 printf("index = %d ",index);
(gdb) print index
$3 = 2
4.3 断点调试(在函数入口处打断点)
格式
breakpoint file_name:function_name
调试样例
代码
#include <iostream>
#include <string>
using namespace std;static int get_index(const string &s1, const string &s2)
{if (&s1 == NULL || &s2 == NULL || s2.length() < 1 && s1.length() < s2.length()){return -1;}int L1 = s1.length();int L2 = s2.length();int i1 = 0;int i2 = 0;int retIndex = 0; // 匹配s1开始的位置while (i1 < L1 && i2 < L2){if (s1[i1] == s2[i2]){++i1;++i2;}else // 以retIndex开头是匹配不出来的 要从 retIndex的下一个开始{i1 = ++retIndex;i2 = 0;}}return i2 == L2 ? retIndex : -1;
}int main()
{std::string s1 = "abcgdb";std::string s2 = "gdb";int index = get_index(s1,s2);std::cout << "index = " << index << std::endl;return 0;
}
编译
g++ -g test.cpp -o test
函数断点调试
[vagrant@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
## 1 . 在函数入口处打断点(gdb) b test.cpp:get_index
Breakpoint 1 at 0x400afe: file test.cpp, line 7.## 2 运行程序
(gdb) r
Starting program: /home/vagrant/clan/test/testBreakpoint 1, get_index (s1="abcgdb", s2="gdb") at test.cpp:7
7 if (&s1 == NULL || &s2 == NULL || s2.length() < 1 && s1.length() < s2.length())
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64## 3 继续运行 直接跳过函数
(gdb) c
Continuing.
index = 3
[Inferior 1 (process 16728) exited normally]
查看断点
info breakpoints
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400afe in get_index(std::string const&, std::string const&) at test.cpp:7breakpoint already hit 1 time
(gdb)
5 调试core文件
5.1 生成core文件的方法
产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置
ulimit -c
ulimit -c unlimited
更改core dump生成路径
## %e表示程序名, %p表示进程id
echo "/home/vagrant/core/core.%e.%p" > /proc/sys/kernel/core_pattern
5.2 调试core文件
测试代码
int main()
{char* str = "gdbcoretest";str[0] = 'G';return 0;
}
编译
g++ -g test.c -o test
运行
[vagrant@chao_1 /home/vagrant/clan/test]$ ./test
Segmentation fault (core dumped)
查看结果,出现了段错误
查看生成的core文件
[vagrant@chao_1 /home/vagrant/core]$ ll
total 300
-rw-------. 1 vagrant vagrant 245760 Nov 12 06:12 core.test.19727
-rw-------. 1 vagrant vagrant 245760 Nov 12 06:15 core.test.20012
调试core文件
## gdb 可执行文件名 core文件名
gdb test core.test.19727
/home/vagrant/clan/test]$ gdb test core.test.20379
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
[New LWP 20379]
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004004fd in main () at testCore.c:5
5 str[0] = 'G';
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
## 查看函数的栈帧 testCore.c 第5行出现了段错误
## 使用 where 也可以
(gdb) bt
#0 0x00000000004004fd in main () at testCore.c:5(gdb) where
#0 0x00000000004004fd in main () at testCore.c:5
相关文章:
C/C++调试工具 - gdb详解
C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…...
传奇GOM引擎微端连接不上如何解决
Gom传奇引擎的微端连不上的原因可能有很多,比如网络问题、服务器配置问题、版本兼容性问题等。1.检查网络连接:首先要确保你的网络连接稳定。如果遇到网络问题,比如网络延迟过高,可能会导致你无法连接到服务器。建议使用稳定的网络…...
Easymesh介绍
1.什么是Easymesh 什么是Easymesh,这里需要介绍到有3个点,分别是WFA、MAP和Easymesh。 WFA是Wi-Fi 联盟,Wi-Fi 联盟是专门针对 Wi-Fi 主题的标准创建机构,并且制定新标准,在 Wi-Fi 基础上提供可用功能,全球成员超过 800 家(SoC、制造商和 SW 公司) MAP 是 Multi-AP Te…...
图像相似度对比方法
1.哈希方法,其中包括均值哈希、插值哈希、感知哈希方法。计算出图片的哈希值,一般使用汉明 距离计算两个图片间的差距。 2.直方图算法,其中包括灰度直方图算法,RGB直方图算法, 3.灰度图算法:MSE、SSIM、…...
C++ 配合图形库实现画线效果
#include<stdio.h> #include <conio.h> #include<math.h> #include <graphics.h> // 引用图形库头文件 #define N 12 int List[N][N];void draw() {for (int i 0; i < N; i) {int x 200 * cos(2 * 3.14 * i / N);int y 200 * sin(2 * 3.1…...
zookeeper应用之分布式屏障
分布式系统中某些节点任务当满足某个条件时才允许继续运行,如果不满足则当前节点需要等待。这个时候就需要一个屏障来阻止节点的处理。ZooKeeper Barrier是ZooKeeper提供的一种用于分布式环境中实现同步和协调的机制。具体逻辑就是: 1、检测某个barrier…...
PDBADMIN 的作用,命名,重建 以及能否DROP
Creating a pluggable database using below SQL: create pluggable database psample1 admin user psample_admin identified by "XXXXXXXXXXXXXXX roles(connect) create_file_destDGEHDB; What if user psample_admin gets dropped accidentally? Is it important?…...
华为L410上制作内网镜像模板02
原文链接:华为L410上制作离线安装软件模板02 hello,大家好啊,今天给大家带来第二篇在内网搭建Apache服务器,用于安装完内网操作系统后,在第一次开机时候,为系统安装软件的文章,今天给大家介绍在…...
美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23
美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23 2023年10月13日,美国材料与试验协会(ASTM)发布了新版玩具安全标准ASTM F963-23 根据CPSIA的规定,当ASTM将ASTM F963的拟定修订意见通知CPSC时,若CPSC认为…...
Postman模拟上传文件
如图,在F12抓到的上传文件的请求 那要在postman上模拟这种上传,怎么操作呢,如图,选中【Select File】选取文件上传即可...
【系统架构设计】架构核心知识: 1 系统工程与信息系统基础
目录 一 系统工程 二 信息系统 三 电子政务 四 企业信息化与电子商务...
加班把数据库重构完毕
加班把数据库重构完毕 本文的数据库重构是基于 clickhouse 时序非关系型的数据库。该数据库适合存储股票数据,速度快,一般查询都是 ms 级别,不需要异步查询更新界面 ui。 达到目标效果:数据表随便删除,重新拉数据以及指…...
Centos(Linux)安装mysql数据库
1. 环境准备 1.1 更新系统和安装依赖项 在进行MySQL安装之前,确保系统包是最新的,并安装必要的依赖项: yum update yum install epel-release yum install wget 1.2 下载MySQL社区版软件包 使用https方式下载MySQL社区版软件包…...
【数据结构】深度剖析ArrayList
目录 ArrayLIst介绍 ArrayList实现的接口有哪些? ArrayList的序列化:实现Serializable接口 serialVersionUID 有什么用? 为什么一定要实现Serialzable才能被序列化? transient关键字 为什么ArrayList中的elementData会被transient修…...
离线环境通过脚本实现服务器时钟同步(假同步)
1、背景 最近遇到一个时钟同步问题,是内网多台服务器之间时钟不同步,然后部署在不同服务器间的应用展示得时间戳不能统一,所以用户让做一下内网服务器间得时钟同步。 内网服务器x86和arm都有,而且有得系统是centos有得是ubuntu&…...
2023年9月青少年软件编程(C语言)等级考试试卷(一级)
日期输出 给定两个整数,表示一个日期的月和日。请按照"MM-DD"的格式输出日期,即如果月和日不到2位时,填补0使得满足2位。 时间限制:10000 内存限制:65536 输入 2个整数m,d(0 < m < 12…...
基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(支持并行网关)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这个章节来完成并行网关,前端无需修改,直接后端修改就可以了。 1、并行网关后端修…...
软件测试面试-银行篇
今天参加了一场比较正式的面试,汇丰银行的视频面试。在这里把面试的流程记录一下,结果还不确定,但是面试也是自我学习和成长的过程,所以记录下来大家也可以互相探讨一下。 请你做一下自我介绍?(汇丰要求英…...
基于Amazon EC2和Amazon Systems Manager Session Manager的堡垒机设计和自动化实现
01 背景 在很多企业的实际应用场景中,特别是金融类的客户,大部分的应用都是部署在私有子网中。为了能够让客户的开发人员和运维人员从本地的数据中心中安全的访问云上资源,堡垒机是一个很好的选择。传统堡垒机的核心实现原理是基于 SSH 协议的…...
虚幻5.3打包Windows失败
缺失UnrealGame二进制文件。 必须使用集成开发环境编译该UE项目。或者借助虚幻编译工具使用命令行命令进行编译 解决办法: 1.依次点击平台-项目启动程序 2.点击后面的按钮进行设置 3.稍等后,打包后的程序即可运行,之后就可以愉快的打包了...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
