GDB调试程序
1.GDB 调试程序
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。在UNIX平台下做软件,GDB这个调试工具有比VC的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
2.调试示例
2.1 示例代码 test.c
#include<stdio.h>
int func (int n) {int sum = 0;int i;for (i = 0; i < n; ++i) {sum += i;}return sum;
}
int main() {int i;long result;for (i = 1; i <= 100; ++i) {result += i;}printf("result[1-100] = %d /n", result);printf("result[1-200] = %d /n",func(200));return 0;
}
2.2 编译生成执行文件
qz@ubuntu:~/network/gdb$ gcc -g test.c -o test
2.3 使用GDB进行调试
qz@ubuntu:~/network/gdb$ gdb test <---------- 启动GDB
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 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:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
---Type <return> to continue, or q <return> to quit---
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb)
l命令
(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
1 #include<stdio.h>
2 int func (int n) {
3 int sum = 0;
4 int i;
5 for (i = 0; i < n; ++i) {
6 sum += i;
7 }
8 return sum;
9 }
10 int main() {
(gdb)
11 int i;
12 long result;
13 for (i = 1; i <= 100; ++i) {
14 result += i;
15 }
16 printf("result[1-100] = %d /n", result);
17 printf("result[1-200] = %d /n",func(200));
18 return 0;
19 }(gdb)
Line number 20 out of range; test.c has 19 lines.
(gdb)
break 设置断点
(gdb) break 11 <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x680: file test.c, line 11.(gdb) break func <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x651: file test.c, line 3.(gdb) info break <-------------------- 查看断点信息。
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000000680 in main at test.c:11
2 breakpoint keep y 0x0000000000000651 in func at test.c:3
运行程序,r命令
(gdb) r
Starting program: /home/qz/network/gdb/test Breakpoint 1, main () at test.c:13
13 for (i = 1; i <= 100; ++i) {
(gdb) n <--------------------- 单条语句执行,next命令简写。
14 result += i;
(gdb) n
13 for (i = 1; i <= 100; ++i) {
(gdb) n
14 result += i;
(gdb) n
13 for (i = 1; i <= 100; ++i) {
(gdb) n
14 result += i;
(gdb) n
13 for (i = 1; i <= 100; ++i) {
(gdb) n
14 result += i;
(gdb) n
13 for (i = 1; i <= 100; ++i) {
(gdb) c
Continuing. <--------------------- 继续运行程序,continue命令简写。Breakpoint 2, func (n=200) at test.c:3
3 int sum = 0;
(gdb) n
5 for (i = 0; i < n; ++i) {
(gdb) p i
$1 = 0
(gdb) n
6 sum += i;
(gdb) p i
$2 = 0
(gdb) n
5 for (i = 0; i < n; ++i) {
(gdb) p i <--------------------- 打印变量i的值,print命令简写。
$3 = 0
(gdb) n
6 sum += i;
(gdb) p i
$4 = 1
(gdb) n
5 for (i = 0; i < n; ++i) {
(gdb) n
6 sum += i;
(gdb) p i
$5 = 2
(gdb) p sum
$6 = 1
(gdb)
bt finish
(gdb) bt <--------------------- 查看函数堆栈。
#0 func (n=200) at test.c:6
#1 0x00005555555546be in main () at test.c:17
(gdb) finish <--------------------- 退出函数。
Run till exit from #0 func (n=200) at test.c:6
0x00005555555546be in main () at test.c:17
17 printf("result[1-200] = %d /n",func(200));
Value returned is $7 = 19900
(gdb) c <--------------------- 继续运行。
Continuing.
result[1-100] = 5050 /n
result[1-200] = 19900 /n
[Inferior 1 (process 58205) exited normally] <----------程序输出。
(gdb) q <--------------------- 退出gdb。
3 使用GDB
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
gcc -g hello.c -o hello
g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
- 1、
gdb <program>
program也就是你的执行文件,一般在当然目录下。 - 2、
gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 - 3、
db <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
4 GDB启动开关
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
-symbols <file>
-s <file>
从指定文件中读取符号表。-se file
从指定文件中读取符号表信息,并把他用在可执行文件中。-core <file>
-c <file>
调试时core dump的core文件。-directory <directory>
-d <directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。
相关文章:
GDB调试程序
1.GDB 调试程序 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。在UNIX平台下做软件,GDB这个调试工具有比VC的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能…...
五种IO模型
用户空间与内核空间 操作系统把内存空间划分成了两个部分:内核空间和用户空间。 为了保护内核空间的安全,操作系统一般都限制用户进程直接操作内核。 所以,当我们使用TCP发送数据的时候,需要先将数据从用户空间拷贝到内核空间&a…...
5 全面认识java的控制流程
全面认识java控制流程1.块作用域2.条件语句3.迭代语句3.1while语句3.2do-while语句3.3for语句3.4 for-in语法4.中断控制流程的语句4.1 return4.2 break和continue4.2.1 不带标签的break语句4.2.2 带标签的break语句4.2.3 continue语句4.3 goto()5.多重选择:switch语句1.块作用域…...
第二章 测验【嵌入式系统】
第二章 测验【嵌入式系统】前言推荐第二章 测验【嵌入式系统】最后前言 以下内容源自《嵌入式系统》 仅供学习交流使用 推荐 第一章 测验【嵌入式系统】 第二章 测验【嵌入式系统】 1单选题 32bit宽的数据0x12345678 在小端模式(Little-endian)模式…...
排序算法之插入排序
要考数据结构了,赶紧来复习一波排序算法 文章目录一、直接插入排序二、希尔排序一、直接插入排序 直接上主题 插排,揪出一个数,插入到原本已经有序的数组里面,如数组有n个数据,从0~n下标依次排列,先从左往…...
Kaggle实战入门:泰坦尼克号生生还预测
Kaggle实战入门:泰坦尼克号生生还预测1. 加载数据2. 特征工程3. 模型训练4. 模型部署泰坦尼克号(Titanic),又称铁达尼号,是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉ÿ…...
【大汇总】11个Python开发经典错误(1)
“但是太阳,他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际,正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。” --------史铁生《我与地坛》 🎯作者主页:追光者♂🔥 🌸个人简介:计算机专业硕士研究生💖、2022年CSDN博客之星人工智能领…...
Java中的异常
程序错误一般分为三种:编译错误: 编写程序时没有遵循语法规则,编译程序能够自己发现错误并提示位置和原因。运行错误:程序在执行的时候运行环境发现了不能执行的操作。比如,JVM出错了,内存溢出等。逻辑错误…...
L2-022 重排链表 L2-002 链表去重
给定一个单链表 L1 →L2→⋯→L n−1 →L n ,请编写程序将链表重新排列为 L n →L 1 →L n−1 →L 2 →⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。 输入格式: 每个输入包含1个测试用例。每个测试用例第1行…...
【手撕八大排序】——插入排序
文章目录插入排序概念插入排序分为2种一 .直接插入排序直接插入排序时间复杂度二.希尔排序希尔排序时间复杂度效率比较插入排序概念 直接插入排序是从一个有序的序列中选择一个合适的位置进行插入,这个合适的位置取决于是要升序排序还是降序排序。 每一次进行排序…...
flink多流操作(connect cogroup union broadcast)
flink多流操作1 分流操作2 connect连接操作2.1 connect 连接(DataStream,DataStream→ConnectedStreams)2.2 coMap(ConnectedStreams → DataStream)2.3 coFlatMap(ConnectedStreams → DataStream)3 union操作3.1 uni…...
漫画:什么是快速排序算法?
这篇文章,以对话的方式,详细着讲解了快速排序以及排序排序的一些优化。 一禅:归并排序是一种基于分治思想的排序,处理的时候可以采取递归的方式来处理子问题。我弄个例子吧,好理解点。例如对于这个数组arr[] { 4&…...
vue 3.0组件(下)
文章目录前言:一,透传属性和事件1. 如何“透传属性和事件”2.如何禁止“透传属性和事件”3.多根元素的“透传属性和事件”4. 访问“透传属性和事件”二,插槽1. 什么是插槽2. 具名插槽3. 作用域插槽三,单文件组件CSS功能1. 组件作用…...
双指针 -876. 链表的中间结点-leetcode
开始一个专栏,写自己的博客 双指针,也算是作为自己的笔记吧! 双指针从广义上来说,是指用两个变量在线性结构上遍历而解决的问题。狭义上说, 对于数组,指两个变量在数组上相向移动解决的问题;对…...
Linux之运行级别
文章目录一、指定运行级别基本介绍CentOS7后运行级别说明一、指定运行级别 基本介绍 运行级别说明: 0:关机 1:单用户【找回丢失密码】 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级别是3和5,也可以…...
python搭建web服务器
前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…...
【SpringCloud】SpringCloud Feign详解
目录前言SpringCloud Feign远程服务调用一.远程调用逻辑图二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用四.构建Feign五.自定义Feign配置六.Feign配置日志七.Feign调优八.抽离Feign前言 微服务分解成多个不同的服务,那么多个服务之间怎么调用呢&…...
更改Hive元数据发生的生产事故
今天同事想在hive里用中文做为分区字段。如果用中文做分区字段的话,就需要更改Hive元 数据库。结果发生了生产事故。导致无法删除表和删除分区。记一下。 修改hive元数据库的编码方式为utf后可以支持中文,执行以下语句: alter table PARTITI…...
《Netty》从零开始学netty源码(八)之NioEventLoop.selector
目录java原生的WEPollSelectorImplnetty的SelectionKey容器SelectedSelectionKeySetnetty的SelectedSelectionKeySetSelectorSelectorTupleopenSelector每一个NioEventLoop配一个选择器Selector,在创建NioEventLoop的构造函数中会调用其自身方法openSelector获取sel…...
TCP UDP详解
文章目录TCP UDP协议1. 概述2. 端口号 复用 分用3. TCP3.1 TCP首部格式3.2 建立连接-三次握手3.3 释放连接-四次挥手3.4 TCP流量控制3.5 TCP拥塞控制3.6 TCP可靠传输的实现3.7 TCP超时重传4. UDP5.TCP与UDP的区别TCP UDP协议 1. 概述 TCP、UDP协议是TCP/IP体系结构传输层中的…...
利用Taotoken的OpenAI兼容协议快速迁移现有Node点js应用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken的OpenAI兼容协议快速迁移现有Node.js应用 对于已经基于OpenAI官方Node.js SDK构建了应用或服务的团队,当…...
(可云端)开源APP与小程序双端控制C51单片机,基于ESP8266与MQTT
1. 项目效果与核心原理 想象一下,你躺在沙发上用手机APP就能控制书桌上的单片机小灯,或者在外出时通过微信小程序查看家里的温湿度数据。这个基于ESP8266和MQTT协议的开源方案,就能帮你实现这些酷炫的功能。我去年给自家花盆做的自动浇水系统…...
基于MCP协议与FCM构建AI助手移动推送通知系统
1. 项目概述:一个连接MCP与FCM的推送桥梁 最近在折腾一些自动化工作流,经常需要在不同的服务和应用之间传递消息和通知。比如,一个脚本运行成功了,或者服务器出了点小状况,如果能第一时间推送到手机上,那处…...
为团队统一配置Claude Code开发环境并接入Taotoken
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为团队统一配置Claude Code开发环境并接入Taotoken 在团队协作开发中,为每位成员提供稳定、高效的AI编程助手能显著提升…...
告别复杂配置!5分钟在Vue/React项目中集成讯飞语音听写WebSocket API
5分钟实现Vue/React与讯飞语音听写的优雅集成方案 在智能语音交互逐渐成为标配的今天,前端开发者经常面临将语音识别能力快速集成到现代Web应用中的需求。讯飞语音听写WebSocket API凭借其流式传输、低延迟的特性,成为众多项目的首选方案。但官方示例往往…...
KMS_VL_ALL_AIO:3分钟完成Windows与Office智能激活的终极指南
KMS_VL_ALL_AIO:3分钟完成Windows与Office智能激活的终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?KMS_VL_ALL_AIO是一款开源智…...
AI驱动CD流水线性能跃迁:实测QPS提升3.8倍、部署失败率下降92.6%的5个核心改造点
更多请点击: https://intelliparadigm.com 第一章:AI原生持续交付:2026奇点智能技术大会部署流水线优化 在2026奇点智能技术大会上,AI原生持续交付(AI-Native CI/CD)成为核心实践范式——它不再将AI模型视…...
使用Taotoken为Claude Code配置稳定API通道避免封号与Token不足
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken为Claude Code配置稳定API通道避免封号与Token不足 对于依赖Claude Code进行日常开发的工程师而言,一个稳…...
深度解析:DXVK Vulkan驱动转换技术如何提升Linux游戏兼容性与性能
深度解析:DXVK Vulkan驱动转换技术如何提升Linux游戏兼容性与性能 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk DXVK是一个基于Vulkan的Direct3D 8/9/10/1…...
程序员学英语:用词根‘ori’和‘pan’搞定技术文档里的‘起源’与‘伙伴’
程序员学英语:用词根‘ori’和‘pan’破解技术文档高频词 技术文档里那些似懂非懂的英文词汇,往往成为程序员阅读源码、理解API的隐形门槛。当你在GitHub看到origin remote时,是否思考过为什么代码仓库的默认远程分支叫这个名字?当…...
