g++与gdb简单学习

本文的内容由智谱清言产生

------

使用g++编译C++程序

使用gdb设置断点,反汇编代码,单步执行

int main()
{int a = 1;a++;return 0;
}

 1.编译程序:使用 g++ 编译器将 C++ 源代码编译成 IA-32 可执行文件。

这可以通过添加 -m32 标志来实现,该标志指示编译器生成 32 位代码

-o test:这是输出选项,用于指定编译后生成的可执行文件的名称。在这个例子中,编译生成的可执行文件将被命名为 test

2. 启动 GDB

 Copyright (C) 2015 Free Software Foundation, Inc.

GDB 的版权归属自由软件基金会(Free Software Foundation),并且是 2015 年的版本。
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

GDB 是在 GNU 通用公共许可证(GPL)版本 3 或更高版本的条款下发布的。你可以在这个网址找到更多关于许可证的信息。
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.

表明在法律允许的范围内,这个软件不提供任何形式的担保。你可以通过输入 “show copying” 和 “show warranty” 命令来查看更多细节。
This GDB was configured as "i686-w64-mingw32".

当前的 GDB 实例是为 i686-w64-mingw32 平台配置的,这意味着它是为 32 位 x86 架构的 Windows 系统编译的。
Type "show configuration" for configuration details.

你可以通过输入 “show configuration” 命令来查看 GDB 的配置详情。
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

如果你在使用 GDB 时发现了错误,可以访问这个网址来获取报告错误的指南。
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

你可以在这个网址找到 GDB 的手册和其他文档资源。
For help, type "help".

如果你需要帮助,可以输入 “help” 命令来获取帮助信息。
Type "apropos word" to search for commands related to "word"...

你可以使用 “apropos word” 命令来搜索与某个单词相关的 GDB 命令。
Reading symbols from test...done.

这表明 GDB 已经从名为 “test” 的可执行文件中读取了符号信息,并准备好了进行调试。

 3.设置断点:在 GDB 中,可以在 main 函数上设置一个断点,然后开始运行程序:

(gdb) break main
(gdb) run

4.反汇编代码:在 GDB 中,可以使用 disass 命令来反汇编代码。

例如,要反汇编 main 函数,可以使用以下命令: 

(gdb) disass main

------ 

汇编指令 movl $0x1,0xc(%esp) 是 IA-32 架构下的一个操作,用于在程序运行时修改变量的值或者设置内存中的特定位置。下面是对这个指令的详细解释:

  • movl:这是 “move long” 的缩写,表示这个指令用于移动(复制)一个 32 位(长字)的数据。

  • $0x1:这是一个立即数(immediate value),即数字 1 的十六进制表示。在 IA-32 架构中,立即数前通常有一个美元符号($)。

  • 0xc(%esp):这是一个基于栈指针(ESP)的间接内存地址%esp 是栈指针寄存器,它指向当前栈帧的顶部。0xc 是一个偏移量,表示从 ESP 寄存器指向的地址向前(向低地址方向)偏移 12 个字节(因为 0xc 是十六进制的 12)。

所以,整个指令的意思是:

将立即数 1(32 位)复制到 ESP 寄存器指向的地址减去 12 字节的位置。

------

汇编指令 addl $0x1,0xc(%esp) 在 IA-32 架构下用于执行加法操作。下面是对这个指令的详细解释:

  • addl:这是 “add long” 的缩写,表示这个指令用于执行 32 位(长字)数据的加法操作。

所以,整个指令的意思是:

将 ESP 寄存器指向的地址减去 12 字节的内存位置中的 32 位值增加 1

这里假设 var 是在栈上分配的,并且它距离 ESP 寄存器指向的位置有 12 字节的偏移。指令 addl $0x1,0xc(%esp) 将会对这个局部变量执行加 1 操作。

这个指令通常用于实现变量自增,或者在循环中进行计数器的递增。由于它直接操作内存中的值,因此它不会影响 EAX(累加器)寄存器中的内容,除非该内存位置恰好是 EAX 寄存器的别名。

------

5.单步执行:可以使用 ni(next instruction)或 si(step instruction)命令单步执行汇编指令。ni 会在执行下一条指令后停止,而 si 会进入函数调用内部。 

------

IA-32是什么?

IA-32,全称为Intel Architecture 32-bit,是英特尔公司开发的一种32位处理器架构,也常被称为x86架构。这个架构支持32位操作,包括32位寄存器、32位内存寻址和32位数据路径。以下是IA-32架构的一些关键特点:

  1. 寄存器:IA-32架构包括一系列通用寄存器(如EAX, EBX, ECX, EDX等),专用寄存器(如ESP, EBP, EIP, EFLAGS等),以及段寄存器(如CS, DS, ES, FS, GS, SS)。

  2. 内存模型:它使用分段内存模型,将内存划分为不同的段,每个段有独立的基址和界限

  3. 指令集:IA-32指令集非常丰富,支持多种数据类型和操作,包括算术运算、逻辑运算、数据传输、控制流等。

  4. 保护模式:IA-32架构支持保护模式,允许操作系统实现多任务处理、内存保护和权限控制

  5. 兼容性:IA-32架构向后兼容早期的16位x86架构,即实模式,这意味着它能够运行为早期x86处理器编写的软件。

  6. 扩展:随着时间的推移,英特尔在IA-32架构上增加了许多扩展,如MMX、SSE、SSE2、SSE3等,以支持多媒体和浮点运算等高级功能。

IA-32架构自1985年推出386处理器以来,一直是个人计算机和服务器市场的主流架构。尽管现在64位架构(如x86-64或AMD64)已经普及,但IA-32架构仍然在某些应用和系统中得到使用。

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

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

相关文章

【小白可懂】微信小程序---课表渲染

结果展示&#xff1a;&#xff08;代码在最后&#xff09; WeChat_20241116174431 项目简介 在数字化校园建设的大背景下&#xff0c;为了更好地服务于在校师生&#xff0c;我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…

【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别

&#x1f449;&#x1f3fc;目录&#x1f448;&#x1f3fc; &#x1f352;1. 数据 1.1 准备数据 1.2 数据预处理 &#x1f352;2. 模型构建 2.1 模型测试 2.2 测试网络运算速度 2.3 输出模型参数量 2.4 输出模型计算量 &#x1f352;3. 模型训练 &#x1f352;4.模…

Python酷库之旅-第三方库Pandas(221)

目录 一、用法精讲 1036、pandas.DatetimeIndex.to_pydatetime方法 1036-1、语法 1036-2、参数 1036-3、功能 1036-4、返回值 1036-5、说明 1036-6、用法 1036-6-1、数据准备 1036-6-2、代码示例 1036-6-3、结果输出 1037、pandas.DatetimeIndex.to_series方法 10…

【WPF】Prism学习(三)

Prism Commands 1.复合命令&#xff08;Composite Commanding&#xff09; 这段内容主要介绍了在应用程序中如何使用复合命令&#xff08;Composite Commands&#xff09;来实现多个视图模型&#xff08;ViewModels&#xff09;上的命令。以下是对这段内容的解释&#xff1a; …

【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

【一键整合包及教程】AI照片数字人工具EchoMimic技术解析

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活。EchoMimic&#xff0c;作为蚂蚁集团旗下支付宝推出的开源项目&#xff0c;不仅为数字人技术的发展掀开了新的一页&#xff0c;更为娱乐、教育、虚拟现实、在线会议等多个领域带…

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…

GitLab 降级安装出现 500 错误,如何解决?

本文分享 GitLab 中文版在降级的过程中出现 500 错误的修复方法。 写在前面 强烈不建议大家自行降级&#xff0c;如果真有降级需求&#xff0c;要么自己能力过硬&#xff0c;要么寻求专业服务【https://dl.gitlab.cn/cm33bsfv】&#xff0c;要不出问题很麻烦&#xff01; 问…

2024-11-16 串的存储结构

一、顺序存储。 1.首先定一个静态数组&#xff0c;然后定义i记录串的实际长度。&#xff08;缺点&#xff1a;长度不可变&#xff09; 2.使用malloc申请动态空间&#xff0c;定义指针指向串的地址。&#xff08;需手动ferr&#xff09; 方案一&#xff1a; 数组末尾记录长度 …

PCHMI串口接收实验

插入的唯一一行代码 config1.START((Control)this, System.Reflection.Assembly.GetExecutingAssembly().GetTypes(), null);

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler

一、BeanDefinitionParserDelegate Spring在解析xml文件的时候&#xff0c;在遇到<bean>标签的时候&#xff0c;我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容&#xff0c;包括<bean>标签的多个属性&#xff0c;例如 id name class in…

ODC 如何精确呈现SQL耗时 | OceanBase 开发者工具解析

前言 在程序员或DBA的日常工作中&#xff0c;编写并执行SQL语句如同日常饮食中的一餐一饭&#xff0c;再寻常不过。然而&#xff0c;在使用命令行或黑屏客户端处理SQL时&#xff0c;常会遇到编写难、错误排查缓慢以及查询结果可读性不佳等难题&#xff0c;因此&#xff0c;图形…

Bugku CTF_Web——No one knows regex better than me

Bugku CTF_Web——No one knows regex better than me 进入靶场 一段PHP代码 <?php error_reporting(0); $zero$_REQUEST[zero]; $first$_REQUEST[first]; $second$zero.$first; if(preg_match_all("/Yeedo|wants|a|girl|friend|or|a|flag/i",$second)){$key$…

爬虫——JSON数据处理

第三节&#xff1a;JSON数据处理 在爬虫开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是最常见的数据格式之一&#xff0c;特别是在从API或动态网页中抓取数据时。JSON格式因其结构简单、可读性强、易于与其他系统交互而广泛应用于前端与后端的数…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.OpenHarmony 标准系统启动引导流程 OpenHarmony标准系统默认支持以下几个镜像&#xff1a; 每个开发板都需要在存储器上划分好分区来存放上述镜像&#xff0c;SOC启动时都由bootloader来加载这些镜像&#xff0c;具体过程包括以下几个大的步骤&#xf…

力扣刷题日记之150.逆波兰表达式求值

今天继续给大家分享一道力扣的做题心得今天这道题目是 150.逆波兰表达式求值 题目如下&#xff0c;题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation 1&#xff0c;题目分析 这道题说是一道中等难度的题目&#xff0c;其实如果理解了其中的…

Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)

目录 一、String字符串类型介绍 二、常见命令 1、SET 2、GET 3、MGET 4、MSET 使用MGET 和 使用多次GET的区别 5、DEL 6、SETNX SET、SET NX和SET XX执行流程 7、INCR 8、INCRBY 9、DECR 10、DECYBY 11、INCRBYFLOAT 12、APPEND 13、GETRANGE 14、SETRANGE …

如何知道表之间的关系(为了知识图谱的构建)

今天就简单点&#xff0c;把今天花时间做的一个程序说下。 我们在做常规知识图谱的时候&#xff0c;面临一个问题就是要知道关系是如何建立。如果表的数量比较少&#xff0c;人工来做还是比较容易的。 如果有非常多的表&#xff0c;并且这些表之间的关联关系都不清楚的情况下…

【软件测试】一个简单的自动化Java程序编写

文章目录 自动化自动化概念回归测试常见面试题 自动化测试金字塔 Web 自动化测试驱动 Selenium一个简单的自动化示例安装 selenium 库使⽤selenium编写代码 自动化 自动化概念 自动的代替人的行为完成操作。自动化在生活中处处可见 生活中的自动化可以减少人力的消耗&#x…