Linux gdb汇编调试

news2024/12/24 21:56:53

文章目录

  • 一、示例代码
  • 二、gdb汇编指令
    • 2.1 step/stepi
    • 2.2 next/nexti
    • 2.3 info registers
    • 2.4 set
    • 2.5 x
    • 2.6 rip寄存器
    • 2.7 rip 寄存器
  • 参考资料

一、示例代码

(1)

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 3;
    int b = 5;

    int c = add(a, b);

    printf("c = %d\n", c);

    return 0;
}

main,add函数下断点:
在这里插入图片描述
main函数调用 call add函数时,将下一条指令的地址0x400566压入栈中,然后跳转到函数add的地址 0x40052d处去执行。

call 指令等价于:

push 0x400566
jmp 0x40052d(add)

在这里插入图片描述
进入到 add 函数,在执行 ret 指令之前,然后 rsp 寄存器的内存地址中的值是 0x400566,即main函数调用add函数压入栈中的地址,执行 stepi指令,add函数执行 ret 指令,pop出该地址 0x400566 ,然后跳转到 0x400566 地址去执行指令,rip寄存器的值也是 0x400566。

ret 指令等效于:

pop 0x400566
jmp 0x400566

(2)
接下来修改一下这个返回地址,调用 add时,add返回地址应该是 0x400566,我们将其修改为0x40056c。
在这里插入图片描述
在这里插入图片描述
可以看到当在 add 调用 ret 指令后,将要执行的下一条指令的地址存放在 0x40056c 中而不是 call add 的下一条指令的地址。

二、gdb汇编指令

2.1 step/stepi

(1)step:用于单步执行程序并停在下一个源代码行,会进入函数。
使用 step 命令时,GDB 会执行当前行的代码,如果当前行包含函数调用,GDB 会跳进函数并停在函数内的第一行代码。如果当前行不包含函数调用,GDB 会停在下一行代码处。如果程序在当前行内包含多条语句,GDB 会执行完当前行内的所有语句并停在下一行代码处。

(2)stepi:以单步执行程序的汇编指令,汇编指令call 函数时,会进入函数。
用于单步执行一条汇编指令并停止。与 step 命令不同的是,step 命令会将当前源代码行(比如C源代码行)作为一个单独的步骤来执行,而 stepi 命令会将汇编指令作为执行的最小单位。

使用 stepi 命令时,GDB 会执行当前指令,并将 PC 寄存器指向下一条指令,然后停止程序的执行。如果当前指令是跳转指令,那么 stepi 命令会跳转到跳转指令的目标地址继续执行。如果当前指令是函数调用指令,那么 stepi 命令会跳转到被调用函数的入口地址,等待下一个命令。

stepi 命令是按照汇编指令执行的,而不是按照源代码行执行的。

2.2 next/nexti

next:用于单步执行程序并停在下一行源代码,不会进入函数。
使用 next 命令时,GDB 会执行当前行的代码,如果当前行包含函数调用,GDB 会跳过函数并停在函数调用的下一行代码。如果当前行不包含函数调用,GDB 会停在下一行代码处。如果程序在当前行内包含多条语句,GDB 只会执行当前行的第一条语句并停在下一行代码处。

nexti:用于执行下一条汇编指令并停止。
使用 nexti 命令时,GDB 会执行当前指令,并将 PC 寄存器指向下一条指令,然后停止程序的执行。如果当前指令是跳转指令,那么 nexti 命令会跳转到跳转指令的目标地址继续执行。如果当前指令是函数调用指令,那么 nexti 命令会将函数作为一个整体执行,并在函数返回时停止。

nexti 命令是按照汇编指令执行的,而不是按照源代码行执行的。

2.3 info registers

info registers 用于查看当前程序的寄存器状态,包括通用寄存器、浮点寄存器、协处理器寄存器等。

使用 info registers 命令时,GDB 会列出当前程序的寄存器状态,每个寄存器的名称、值和格式(十六进制或十进制)都会被显示出来。通常情况下,一般只需要查看一部分寄存器的值,可以使用 info registers 命令后面跟上寄存器名称的方式来查看指定寄存器的值。比如:

(gdb) info registers rsp

可以使用 set $register=value 命令来设置寄存器的值,以便进行调试和测试。

2.4 set

用于设置变量、内存地址、寄存器或者其他 GDB 配置选项的值。使用 set 命令可以在调试过程中修改变量的值或者更改 GDB 的配置选项,以便更好地进行调试和分析。

2.5 x

显示内存中的内容,格式如下:
x/[n][f][size] address:其中,n表示要显示的数据的数量,f表示要显示的数据的格式,size表示每个数据的大小,address表示要显示的内存地址。

f 选项可以用于指定要显示的数据的格式。下面是一些常见的数据格式:
x: 以十六进制格式显示数据。
d: 以十进制格式显示数据。
u: 以十进制无符号整数格式显示数据。
o: 以八进制格式显示数据。
t: 以二进制格式显示数据。
a: 以地址格式显示数据。
c: 以字符格式显示数据。
f: 以浮点数格式显示数据。
s: 以字符串格式显示数据。
i: 以指令格式显示数据。

size 选项可以用于指定要显示的每个数据的大小。下面是一些常见的数据大小选项:
b: 每个数据的大小为1字节(即8位)。
h: 每个数据的大小为2字节(即16位)。
w: 每个数据的大小为4字节(即32位)。
g: 每个数据的大小为8字节(即64位)。

2.6 rip寄存器

rsp 寄存器是 x86_64 架构中的一个 64 位寄存器,用于存储栈指针(Stack Pointer,SP)。栈指针是一个指向当前栈顶的内存地址的指针,用于指示下一个入栈或出栈操作的位置。

在函数调用时,rsp 寄存器会被用于存储当前函数的栈帧信息,包括函数的返回地址、参数、局部变量等。在函数返回时,rsp 寄存器会被重新设置为之前保存的值,以便恢复上一个函数的栈帧信息。

在程序执行过程中,rsp 寄存器的值会随着栈的变化而不断改变。当程序执行入栈操作时,rsp 寄存器的值会减小,指向新的栈顶位置。当程序执行出栈操作时,rsp 寄存器的值会增加,指向上一个栈顶位置。

在 GDB 中,可以使用 info registers 命令或 print $rsp 命令来查看 rsp 寄存器的值。比如:

(gdb) print $rip
$1 = (void (*)()) 0x400537 <add+10>
(gdb) info registers rip
rip            0x400537 0x400537 <add+10>

同时,可以使用 x 命令来查看栈内存的内容,例如:

(gdb) x/8xg $rsp

这样就可以以十六进制格式查看栈顶的 8 个 64 位数据。

2.7 rip 寄存器

rip 寄存器是 x86_64 架构中的一个 64 位寄存器,用于存储指令指针(Instruction Pointer,IP)。指令指针是一个指向下一条将要执行的指令的地址的指针,用于指示程序的执行位置。

在程序执行过程中,rip 寄存器的值会随着指令的执行而不断改变。当程序执行一条指令时,rip 寄存器的值会自动增加,指向下一条指令的地址。如果程序遇到跳转指令,rip 寄存器的值会被修改为跳转目标的地址,以便程序跳转到指定位置继续执行。

在 GDB 中,可以使用 info registers 命令或 print $rip 命令来查看 rip 寄存器的值。

参考资料

https://cloud.tencent.com/developer/article/1646414

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

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

相关文章

Linux安装或者升级cmake,例子为v3.10.2升级到v3.25.0(自己指定版本)

1. 引言 系统: ubuntu 1804 64位点我进入清华源-GCC链接: https://cmake.org/files/v3.25/ 先卸载自己电脑上的cmake。 cmake -version sudo apt-get autoremove cmake2. 下载编译指定版本cmake 可以根据自己的需求下载对应版本的cmake。 cd ~ && mkdir cmake &…

3Ds max图文教程:高精度篮球3D建模

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 第 1 步。使用以下设置在顶部视口上创建球体&#xff1a; 第 2 步。将球体转换为可编辑的多边形&#xff1a; 第 3 步。转到 Edge 子对象级别并剪切以下边缘&#xff1a; 第 4 步。选择以下边&#xff0c;然…

农产品后台管理系统(一)——项目总览

后端技术栈 SpringBoot2.xMybatis-plusMysql8.0redisjsoup&#xff08;测试爬取数据&#xff09; 前端技术栈 Vue3EchartsAxios前端组件&#xff1a;element-china-area-data、element-plus 项目概览截图 登录界面 注册界面 农产品发布界面 用户管理界面 用户画像界面 订单…

【JavaEE】Tomcat的安装和使用、创建Mevan项目使用Servlet写一个程序

目录 前言 一、Tomcat的下载和安装 二、写一个简单的Servlet项目 1、创建一个Maven项目 2、引入依赖 3、创建目录 4、编写Servlet代码。 5、打包程序 6、将程序部署到Tomcat上 7、验证程序运行结果 三、在IDEA上安装Smart Tomcat插件 四、Servlet中的一些常见错误 …

欧姆龙plc之间的以太网通讯

捷米特JM-ETH-CP转以太网模块控&#xff0c;用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集&#xff0c;非常方便构建生产管理系统。 支持 FINS/UDP、FINS/TCP 以太网协议通信&#xff0c;支持上位机软件&#xff08;组态王、MCGS、力控、KepWare OPC 服务器等&#…

怎么把pdf转换成jpg图片?这几种方法纯干货

怎么把pdf转换成jpg图片&#xff1f;PDF和JPG是两种常见的文件格式&#xff0c;它们各自有自己的应用场景和优势。PDF格式通常用于创建和共享文档&#xff0c;因为它可以保留文档中的格式和布局&#xff0c;而且可以在几乎所有设备上查看。JPG格式通常用于存储和共享图像文件&a…

5款实用的软件,能帮你解决一些工作和生活中的问题

​ 我乐于分享一些有用的软件给大家&#xff0c;让大家的工作更高效。今天&#xff0c;我要向大家推荐五款实用的软件&#xff0c;它们都能帮你解决一些工作和生活中的问题。 桌面整理——蜂窝桌面整理 ​ 蜂窝桌面整理是一个桌面整理软件&#xff0c;可以让你在桌面上创建和…

OpenCV for Python 学习第四天 :通道的获取与合并

上一篇博客&#xff0c;我们学习了如何通过更快的item()和itemset()的方法访问图片&#xff0c;以及了解了图像的兴趣位置的获取方法&#xff0c;那么今天&#xff0c;我们将学习通道的处理方法&#xff0c;通过通道的拆分和合并的实例&#xff0c;让大家更好的了解咱们有关于B…

论文解读:LaMa:Resolution-robust Large Mask Inpainting with Fourier Convolutions

论文&#xff1a;https://arxiv.org/pdf/2109.07161.pdf 代码&#xff1a; GitHub - advimman/lama: &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022 目录 1 摘要&#xff1a; 2 主要贡献&#xff…

Bland-Altman LOA:衡量测量方法一致性的统计分析方法,也可用来做分割评价指标

Bland-Altman LOA&#xff08;Limits of Agreement&#xff09;是一种用于评估两种测量方法一致性的常用统计分析方法。 在医学研究和临床实践中&#xff0c;我们经常会面临不同测量方法之间的比较和评估问题。为了确定两种测量方法是否能够得出相似的结果&#xff0c;我们需要…

D. Accommodation

Problem - 1804D - Codeforces 思路&#xff1a;首先我们可以统计一下开着灯的个数&#xff0c;对于一个卧室的来说&#xff0c; 不会存在让灯减少的情况&#xff0c;而对于两个卧室的来说&#xff0c;存在4种情况&#xff0c;00&#xff0c;01&#xff0c;10&#xff0c;11&am…

hosts文件锁定,如何修改hosts文件权限

hosts文件能够让我们配置域名和IP的映射关系&#xff0c;方便局域网的用户&#xff0c;可是有的用户想在hosts里添加修改&#xff0c;发现host文件被锁死&#xff0c;host文件左下角出现一个&#x1f512;&#xff0c;怎么办呢&#xff0c;如何修改hosts文件权限。 应用程序-实…

【DevOps】Atlassian插件开发指南

本文以Bamboo插件开发为例&#xff0c;记录一下插件开发过程。 一、简介 Atlassian Bamboo 6.9.1 是一款持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;支持使用插件扩展其功能。如果需要开发自己的 Bamboo 插件并添加到 Bamboo 中&#xff0c;则可以参考…

OpenCv之图像形态学(二)

目录 一、形态学梯度 二、顶帽操作 三、黑帽操作 一、形态学梯度 梯度原图 - 腐蚀腐蚀之后原图边缘变小&#xff0c;原图 - 腐蚀 就可以得到腐蚀掉的部分&#xff0c;即边缘 案例代码如下: import cv2 import numpy as np# 导入图片 img cv2.imread(6.jpg)# 注意调节kern…

nginx基础2——配置文件详解(网页配置篇)

文章目录 一、基本了解二、nginx.conf配置参数2.1 调试参数2.2 必配参数2.3 优化性能参数2.4 event{}段配置参数2.5 网络连接参数2.6 fastcgi配置参数2.7 总结常配参数 三、http{}段配置参数3.1 配置结构3.2 精简配置网页3.3 location定义网页3.3.1 root path用法3.3.1 alias p…

atc201(组合数学)+cf1400(溢水法)

C - Secret Number 题意&#xff1a;给你一个字符串&#xff0c;分别表示0-9的状态。求一个四位密码的组合有多少种。 O&#xff1a;表示密码一定有该数字。 X&#xff1a;表示密码一定没有该数字。 &#xff1f;&#xff1a;不确定密码里有没有&#xff0c;可能有可能没有&…

bgp联邦

1、ip配置 [r1-LoopBack0]ip address 192.168.1.1 24 [r1-LoopBack1]ip address 10.0.0.1 24 [r1-GigabitEthernet0/0/0]ip address 12.0.0.1 24[r2-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [r2-GigabitEthernet0/0/1]ip address 172.16.1.1 29 [r2-GigabitEthernet0/0/…

js - 对forEach()函数的一些理解

1&#xff0c;定义和用法 定义&#xff1a; forEach() 方法用于调用数组的每个元素&#xff0c;并将元素传递给回调函数。注意: forEach() 对于空数组是不会执行回调函数的。 用法&#xff1a; // 箭头函数 forEach((element) > { /* … */ }) forEach((element, index) &…

RS485远传电表有哪些功能?

RS485远传电表是一种具有远程传输功能的电表&#xff0c;可以通过RS485接口进行数据传输。它主要用于远程测量电能消耗、监测电力质量和实时控制电力负载等方面。 RS485远传电表具有多种功能&#xff0c;如&#xff1a; 1.远程测量电能消耗&#xff1a;RS485远传电表可以通过远…

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3(GDB调试器的基础使用)

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3&#xff08;GDB调试器的基础使用&#xff09; 目录 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3&#xff08;GDB调试器的基础使用&#xff09;背景gdb的一些指令gdb实际运用显示代码运行程…