ARM Linux 系统稳定性分析入门及渐进 13 -- gdb 反汇编 disassemble 命令详细介绍及举例】
文章目录
- 1.1 gdb 调试回顾
- 1.1.1 gdb list 命令介绍
- 1.2 反汇编命令 dis 介绍
- 1.2.1 如何设置 gdb 汇编代码的格式
1.1 gdb 调试回顾
在GNU调试器(GDB)中,有许多命令可以帮助我们调试应用程序。
gdb: 这是一个强大的Unix下的程序调试工具。以下是使用gdb的一个简单示例:
$ gdb ./test
在这个例子中,我们启动了gdb并将我们的程序test作为参数传递。
可执行程序 test 是由下面代码使用gcc -g -O0 test.c -o test编译出来:
#include<stdio.h>
#include<stdlib.h>static int bar(void)
{char *p = NULL;printf("I am bar,I will core dump\n");printf("%s",p);*p =0x0;return 0;
}static int foo(void)
{int i ;printf("I am foo,I will call bar\n");bar();return 0;
}int main(void)
{printf("I am main, I wll can foo\n");foo();return 0;
}
1.1.1 gdb list 命令介绍
llist: llist 命令用于显示当前源代码的行列表,包括当前行以及周围的几行代码。这对于查看代码的上下文非常有用。
例如,你可以使用llist命令来显示当前行及周围的10行代码:
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb) list 10
5 {
6 char *p = NULL;
7
8 printf("I am bar,I will core dump\n");
9 printf("%s", p);
10
11 *p = 0x0;
12
13 return 0;
14 }
(gdb)
这将显示源代码的当前行周围的文本。
1.2 反汇编命令 dis 介绍
dis/disassemble: 这个命令用于查看汇编代码。例如,我们可以使用以下命令查看当前函数的汇编代码:
(gdb) disassemble
或者查看指定函数的汇编代码:
[11:01:22]sam@codingcos-sam-laptop (*^~^*) ~/test> gdb test
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 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/>.
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 test...
(gdb) dis foo
Bad breakpoint number 'foo'
(gdb)
从上面的信息可以看到gdb并没有对函数 foo 进行反汇编,而是报出错误:“Bad breakpoint number ‘foo’”,甚是疑惑!!!, 网上搜了一大圈也没找到原因!!
后来发现是在使用gdb时没有设置断点导致的,如果按照下面方式,则可以进行反汇编
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb) b foo
Breakpoint 1 at 0x11bd: file test.c, line 19.
(gdb) dis foo
Bad breakpoint number 'foo'
(gdb) disassemble foo
Dump of assembler code for function foo:0x00000000000011b5 <+0>: endbr640x00000000000011b9 <+4>: push %rbp0x00000000000011ba <+5>: mov %rsp,%rbp0x00000000000011bd <+8>: lea 0xe5f(%rip),%rax # 0x20230x00000000000011c4 <+15>: mov %rax,%rdi0x00000000000011c7 <+18>: call 0x1060 <puts@plt>0x00000000000011cc <+23>: call 0x1169 <bar>0x00000000000011d1 <+28>: mov $0x0,%eax0x00000000000011d6 <+33>: pop %rbp0x00000000000011d7 <+34>: ret
End of assembler dump.
但是目前还不清楚为何使用 dis 命令不生效。
如下是使用 arm gdb 的反汇编示例(前提要有arm gcc 编译出来的 .o文件):
arm-none-eabi-gdb ./build/bsp/sam/sam_demo/common/soc.o
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-none-eabi".
Reading symbols from ./build/bsp/sam/sam_demo/common/soc.o...
(gdb) b reboot
Breakpoint 1 at 0x214: file /mnt/user_home/sam/rt-thread/bsp/sam/sam_demo/common/soc.c, line 36.
(gdb) disassemble reboot
Dump of assembler code for function reboot:0x00000208 <+0>: push {r7}0x0000020a <+2>: sub sp, #200x0000020c <+4>: add r7, sp, #00x0000020e <+6>: mov r3, r00x00000210 <+8>: str r1, [r7, #0]0x00000212 <+10>: strb r3, [r7, #7]0x00000214 <+12>: ldr r3, [pc, #24] ; (0x230 <reboot+40>)0x00000216 <+14>: str r3, [r7, #12]0x00000218 <+16>: dmb sy0x0000021c <+20>: ldr r2, [pc, #20] ; (0x234 <reboot+44>)0x0000021e <+22>: ldr r3, [r7, #12]0x00000220 <+24>: str r3, [r2, #0]0x00000222 <+26>: nop0x00000224 <+28>: adds r7, #200x00000226 <+30>: mov sp, r70x00000228 <+32>: ldr.w r7, [sp], #40x0000022c <+36>: bx lr0x0000022e <+38>: nop0x00000230 <+40>: lsls r3, r4, #120x00000232 <+42>: movs r0, #33 ; 0x210x00000234 <+44>: asrs r0, r0, #20x00000236 <+46>: mov r1, r0
End of assembler dump.
(gdb)
另外一种查看汇编代码的方式是使用 x 命令,如下显示 pc 开始的 3 条指令:
Breakpoint 1, foo () at test.c:19
19 printf("I am foo,I will call bar\n");
(gdb) x/3i $pc
=> 0x5555555551bd <foo+8>: lea 0xe5f(%rip),%rax # 0x5555555560230x5555555551c4 <foo+15>: mov %rax,%rdi0x5555555551c7 <foo+18>: call 0x555555555060 <puts@plt>
(gdb)
arm gdb 反汇编示例:
查看0x0地址开始后面的10条汇编:
arm-none-eabi-gdb ./build/bsp/sam/sam_demo/common/soc.o
...
(gdb) x/3i 0x00x0 <__NVIC_SetPriority>: push {r7}0x2 <__NVIC_SetPriority+2>: sub sp, #120x4 <__NVIC_SetPriority+4>: add r7, sp, #0
(gdb) x/10i 0x000000000x0 <__NVIC_SetPriority>: push {r7}0x2 <__NVIC_SetPriority+2>: sub sp, #120x4 <__NVIC_SetPriority+4>: add r7, sp, #00x6 <__NVIC_SetPriority+6>: mov r3, r00x8 <__NVIC_SetPriority+8>: str r1, [r7, #0]0xa <__NVIC_SetPriority+10>: strh r3, [r7, #6]0xc <__NVIC_SetPriority+12>: ldrsh.w r3, [r7, #6]0x10 <__NVIC_SetPriority+16>: cmp r3, #00x12 <__NVIC_SetPriority+18>: blt.n 0x2a <__NVIC_SetPriority+42>0x14 <__NVIC_SetPriority+20>: ldr r3, [r7, #0]
(gdb)
1.2.1 如何设置 gdb 汇编代码的格式
GDB 主要支持两种汇编代码格式:
-
AT&T风格:这是GDB的默认汇编代码格式,是在Unix和GNU系统中常见的格式。在AT&T风格的汇编代码中,操作数的顺序是“源,目标”,立即数和绝对地址值以美元符号"$"作为前缀,寄存器名称以百分号"%"作为前缀。 -
Intel风格:这是在Intel文档和Windows环境中常见的格式。在Intel风格的汇编代码中,操作数的顺序是“目标,源”,立即数和绝对地址值没有特殊的前缀,寄存器名称也没有特殊的前缀。
可以使用 show disassembly-flavor 命令查看当前的汇编代码风格。例如:
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(gdb) dis foo
Bad breakpoint number 'foo'
(gdb) show disassembly-flavor
The disassembly flavor is "att".
(gdb)
可以看到默认是 AT&T风格。
如果你想要改变汇编代码风格,你可以使用 set disassembly-flavor 命令来设置新的风格。例如,如果你想要设置成Intel风格,你可以这样做:
(gdb) set disassembly-flavor intel
如果你想要设置成AT&T风格,你可以这样做:
(gdb) set disassembly-flavor att
相关文章:
ARM Linux 系统稳定性分析入门及渐进 13 -- gdb 反汇编 disassemble 命令详细介绍及举例】
文章目录 1.1 gdb 调试回顾1.1.1 gdb list 命令介绍 1.2 反汇编命令 dis 介绍1.2.1 如何设置 gdb 汇编代码的格式 1.1 gdb 调试回顾 在GNU调试器(GDB)中,有许多命令可以帮助我们调试应用程序。 gdb: 这是一个强大的Unix下的程序调试工具。以…...
python连接Microsoft SQL Server 数据库
python代码 Author: tkhywang 2810248865qq.com Date: 2023-08-21 11:22:24 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-08-21 11:29:30 FilePath: \PythonProject02\Microsoft SQL Server 数据库.py Description: 这是默认设置,请设置customMade, 打开koroFi…...
docker可视化工具
安装Portainer 官方安装说明:https://www.portainer.io/installation/ [rootubuntu1804 ~]#docker pull portainer/portainer[rootubuntu1804 ~]#docker volume create portainer_data portainer_data [rootubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:90…...
MySQL 用户管理操作
目录 一、用户管理概述 二、用户管理 1、创建用户 2、删除用户 三、账户密码管理 1、root用户修改自己的密码 2、ROOT用户修改其他普通用户密码 3、普通用户修改自己的密码 4、ROOT用户密码忘记解决办法 1)Linux系统 2)windows系统 四、用户权…...
【python办公自动化】PysimpleGUI中的popup弹窗中的按钮设置居中
PysimpleGUI中的popup弹窗中的按钮设置居中 背景问题解决背景 默认的popup弹窗中的OK按钮是在最下面偏左侧一些,有时需要将按钮放置居中 问题解决 首先找到pysimplegui源代码文件中popup的部分 然后定位到19388行,源文件内容如下 关于popup弹窗OK按钮的设置,将pad属性…...
postgresql 同步流复制两个相关参数synchronous_commit 和 synchronous_standby_names
一:synchronous_commit 1.synchronous_commit参数含义 这个参数用来设置事务提交返回客户端之前,一个事务是否需要等待 WAL 记录被写入磁盘。合法的值是{local,remote_write,remote_apply,on,off}。默认设置是on。 2.各可选值含义 2.1 local 当事务…...
运算放大器发展史
在内部集成了一个补偿电容 MPS公司OP07推出后,大受欢迎。各家厂商都推出了自己的 这4款都是可以替换的...
LVS+Keepalived 实验
Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器…...
FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装
FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装 0. 界面预览1. Docker安装1.1 下载docker镜像1.2 启动docker镜像1.3 登录 2. 脚本安装2.1 下载2.2 安装2.3 登录2.4 卸载程序 3. 镜像安装3.1 下载镜像3.2 安装镜像3.3 登录 0. 界面预览 http://myfs.f3322.net…...
内网渗透神器CobaltStrike之权限提升(七)
Uac绕过 常见uac攻击模块 UAC-DLL UAC-DLL攻击模块允许攻击者从低权限的本地管理员账户获得更高的权限。这种攻击利用UAC的漏洞,将ArtifactKit生成的恶意DLL复制到需要特权的位置。 适用于Windows7和Windows8及更高版本的未修补版本 Uac-token-duplication 此攻…...
使用haproxy搭建web架构
haproxy HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。 HAProxy提供了可以在七层和四层两种负载均衡能力,它可以提供高可用性、负载均衡、及基于TCP和HTTP应用的代理。适用于负载大的Web站点,在运行在硬件上可…...
Java基础之IO流File类创建及删除
1.File类概述及构造方法 2.File类创建功能 文件创建成功! 如果文件不存在,就创建文件,并返回true 如果文件存在,就不创建文件,并返回false 如果文件夹不存在,就创建文件夹,并返回true 如果文件…...
高速道路监控:工业路由器助力高速监控远程管理与维护
工业路由器在物联网应用中扮演着重要的角色。物联网的发展使得大量设备和传感器能够互联互通,而工业路由器作为连接这些设备和网络的中间桥梁,承担着数据传输和安全管理的重要责任。 工业路由器能够为高速监控提供网络功能,实现户外无线网络部…...
【校招VIP】前端基础之post和get
考点介绍: get和post 是网络基础,也是每个前端同学绕不过去的小问题,但是在校招面试中很多同学在基础回答中不到位,或者倒在引申问题里,就丢分了。 『前端基础之post和get』相关题目及解析内容可点击文章末尾链接查看…...
如何合理设计API接口?
本规范仅适用于由服务器端发起调用请求、POST提交数据以及GET请求文本数据结果的API,统一采用UTF-8编码规则,采用JSON格式响应。 URL定义 API 服务接口应提供REST风格的HTTP(HTTPS) 接口: {protocol}://{domain}:{port}/{app}/{controller}/{action}?{query} 变量 含义 示…...
Jsp 解决out.print()输出多出空行
一、原因 在 JSP 中,HTML 标签和 JSP 指令之外的内容会被当作文本处理,包括空行、空格和制表符等。当 JSP 引擎解析 JSP 页面时,会将这些文本内容原封不动地输出到响应中。 http响应 二、解决方法 在Jsp页面最前端添加 <% page trimDir…...
SMC状态机 讲解2 从模型到SMC
SMC状态机 讲解2 从模型到SMC 1、实例化有限状态机(FSM)2、简单转换 Simple Transition3、外部环回转换 External Loopback Transition4、内部环回转换 Internal Loopback Transition5、转换动作6、转换Guard7、转换参数8、Entry 和 Exit动作9、Push 转换10、Pop转换…...
MyBatis-Plus的使用
MyBatis-Plus 1、mybatis-plus介绍 官网:https://baomidou.com/ MyBatis-Plus (简称 MP)是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper…...
板卡设计+硬件每日学习十个知识点(44)23.8.24 (检测单元设计,接口部分设计,板卡电源输入设计,电源检测电路)
文章目录 1.检测单元介绍(使用GD32单片机)2.GD32的最小系统板3.GD32的温度监测4.GD32的电压监测和电流监测5.GD32的布线6.接口部分设计7.板卡电源输入设计8.电源检测电路 1.检测单元介绍(使用GD32单片机) 答: 首先要为…...
jmeter HTTP信息头管理器
首先,打开JMeter并创建一个新的测试计划。右键单击测试计划,选择"添加" > “线程组”,然后在线程组上右键单击,选择"添加" > “Sampler” > “HTTP请求”。 在HTTP请求中填写服务器的URL和其他必要…...
从U盘到高端SSD:一文搞懂FTL映射表(块/页/混合)的演进与实战选择
从U盘到高端SSD:一文搞懂FTL映射表(块/页/混合)的演进与实战选择 存储设备的性能差异往往隐藏在底层算法的设计哲学中。当你在电商平台对比两款SSD时,是否思考过为什么同样标称1TB容量的产品,价格能相差数倍ÿ…...
AzurLaneAutoScript:解放双手的碧蓝航线智能自动化脚本
AzurLaneAutoScript:解放双手的碧蓝航线智能自动化脚本 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为《…...
CNAS实验室一份完整的质量手册需要包含哪些要素?一文教会质量手册编写
编写质量管理体系文件是CNAS实验室认证工作中非常重要的一个环节,实验室质量管理体系文件按照惯例,一般会分为四个层级,质量手册、程序文件、作业指导书和记录文件。实验室质量手册是实验室依据相关标准制定的纲领性文件,系统规定…...
企业级融媒体生产管理平台/智能会议管理系统EasyDSS构建一体化应急视频指挥体系
在自然灾害、安全生产事故等突发事件处置中,应急指挥的核心诉求是数据绝对安全、指令极速传递、态势全面感知。私有化视频会议系统EasyDSS打破传统协作壁垒,为应急指挥打造专属化、高可靠的音视频中枢,成为应急处置的核心技术支撑。一、私有化…...
3个步骤让你的Mac原生支持200+视频格式预览
3个步骤让你的Mac原生支持200视频格式预览 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.com/gh_mirrors/ql/Qu…...
分支管理(二):解决合并冲突,处理“代码打架”
1. 问题场景 你已经学会了创建分支和合并分支。在上一篇文章里,合并过程顺滑得像切黄油——Git 自动完成了所有工作。但真实世界里,你和一个同事可能同时修改了同一个文件的同一处代码。当你试图把两个分支合并在一起时,Git 会停下来…...
八大排序算法 - 冒泡排序
一、算法简介冒泡排序是最基础的交换类排序,思路简单易懂。原理是相邻元素两两比较,逆序则交换,大数逐步向后沉,小数向前冒,如同气泡上浮。时间复杂度:最优(O(n)) 最坏 / 平均(O(n^2))空间复杂度࿱…...
ESP32-S3开发板AIoT入门:从硬件解析到边缘AI实战
1. 启明云端WT32-S3-DK开发板:一款被低估的AIoT入门利器如果你正在寻找一款既能玩转物联网基础应用,又能轻松涉足边缘AI的入门级开发板,启明云端的WT32-S3-DK绝对是一个值得你花时间研究的选项。它基于乐鑫的ESP32-S3芯片,但并非简…...
TVBox 最新版本 | 接口持续更新 | 追剧稳定不失效
分享一个自用很久、一直在持续维护更新的 TVBox 版本,主打稳定、流畅、长期可用,接口会定期更新,避免失效问题。 🔥资源特点 精准区分 64 位新设备 / 32 位老设备,安装更适配全设备兼容:电视、盒子、手机…...
从Kafka设计哲学到高性能系统通用模式:吞吐、顺序I/O与批处理的艺术
1. 项目概述:为什么是Kafka?如果你在后台开发、数据平台或者中间件领域摸爬滚打过几年,大概率会听过甚至深度使用过Apache Kafka。它早已不是一个简单的消息队列,而是现代数据驱动架构的“中枢神经系统”。我最初接触Kafka&#x…...
