08 `.o`中的汇编信息 hopper disassembler 调试 HelloWorld

news2024/9/25 21:29:57

前言

上周[2020.05.23]想要 直接使用 fastdebug 版本的 jdk 来进行调试, 可惜失败了 

原来是 缺少 可执行文件关联的, object file, 里面记录了 关联的源码的一些信息 

看来还是 免不了, 需要 手动 编译 open jdk, 哎 

本文主要是两个东西 : 1. 查看 object file 中的汇编信息, 2. 基于 hopper disassembler 来调试 代码 

测试用例

//
// Created by Jerry.X.He on 2019-12-09.
//

#include <iostream>
using namespace std;

int main() {

    int x = 2;
    int y = 3;
    int z = x + y;

    cout << " x + y = " << z << endl;

    return 0;

}

执行效果如下  

查看 object file 中的汇编信息 

从可执行文件中查询 object file 的信息 

master:cmake-build-debug jerry$ nm -pa HelloWorld | grep OSO
000000005dedb851 - 03 0001   OSO /Users/jerry/ClionProjects/HelloWorld/cmake-build-debug/CMakeFiles/HelloWorld.dir/Test01AddOpe.cpp.o

 查看 object file 中的代码的信息 (忽略了部分无关的代码)

master:HelloWorld.dir jerry$ objdump -S -l Test01AddOpe.cpp.o 

Test01AddOpe.cpp.o:	file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:
_main:
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:8
; int main() {
       0:	55 	pushq	%rbp
       1:	48 89 e5 	movq	%rsp, %rbp
       4:	48 83 ec 20 	subq	$32, %rsp
       8:	48 8b 3d 00 00 00 00 	movq	(%rip), %rdi
       f:	c7 45 fc 00 00 00 00 	movl	$0, -4(%rbp)
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:10
; int x = 2;
      16:	c7 45 f8 02 00 00 00 	movl	$2, -8(%rbp)
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:11
; int y = 3;
      1d:	c7 45 f4 03 00 00 00 	movl	$3, -12(%rbp)
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:12
; int z = x + y;
      24:	8b 45 f8 	movl	-8(%rbp), %eax
      27:	03 45 f4 	addl	-12(%rbp), %eax
      2a:	89 45 f0 	movl	%eax, -16(%rbp)
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:14
; cout << " x + y = " << z << endl;
      2d:	48 8d 35 2c 0c 00 00 	leaq	3116(%rip), %rsi
      34:	e8 00 00 00 00 	callq	0 <_main+0x39>
      39:	8b 75 f0 	movl	-16(%rbp), %esi
      3c:	48 89 c7 	movq	%rax, %rdi
      3f:	e8 00 00 00 00 	callq	0 <_main+0x44>
      44:	48 89 c7 	movq	%rax, %rdi
      47:	48 8d 35 00 00 00 00 	leaq	(%rip), %rsi
      4e:	e8 00 00 00 00 	callq	0 <_main+0x53>
      53:	31 c9 	xorl	%ecx, %ecx
; /Users/jerry/ClionProjects/HelloWorld/Test01AddOpe.cpp:16
; return 0;
      55:	48 89 45 e8 	movq	%rax, -24(%rbp)
      59:	89 c8 	movl	%ecx, %eax
      5b:	48 83 c4 20 	addq	$32, %rsp
      5f:	5d 	popq	%rbp
      60:	c3 	retq
      61:	66 2e 0f 1f 84 00 00 00 00 00 	nopw	%cs:(%rax,%rax)
      6b:	0f 1f 44 00 00 	nopl	(%rax,%rax)

上面的注释, 已经解释的相当详尽了, 因此 这里就不赘述了 

hopper disassembler 调试 HelloWorld 

hopper disassembler 加载可执行文件, 如上图, 汇编代码 和 object file 中的内容一致, 不过没有 加注释的 object file 中的信息那么详尽 

因为程序本身也比较简单, 因此 没得太多的 需要描述的 

图中 0000000100001174 的位置, 我添加了一个断点, 然后执行到 断点处, 我调试到了 图中 RIP 的指令的位置 

此时通用寄存器的信息入上图 , 我们重点关注一下 栈帧中的信息 

栈帧信息如上图 

bp 寄存器为 0x7FFEEFBFFDB0, sp 寄存器为 0x7FFEEFBFFD90 

0x7FFEEFBFFDA0 行 从右到左 依次为 : 这个slot不清楚, x, y, z 

0x7FFEEFBFFD90 行 最右边的 8字节 暂存的 rax 

这边这个 console 似乎是 基于 lldb, 使用非常方便 

参考

LLDB not showing source code

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

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

相关文章

CSS权威指南(一)CSS概述

文章目录1.元素2.引入样式表3.样式表4.媒体查询5.特性查询1.元素 &#xff08;1&#xff09;置换元素和非置换元素 置换元素&#xff0c;指用来置换元素内容的部分不由文档内容直接表示。比如img标签。非置换元素&#xff0c;元素的内容是由用户代理在元素自身生成的框中显示…

这样的C盘或许还有?救救C盘......

C盘红了&#xff01;&#xff01;&#xff01; 大部分软件默认缓存在C盘&#xff08;有的甚至只能安装到C盘&#xff09; C盘太满电脑运行会很卡顿 对于这种情况&#xff0c;为了节约C盘空间&#xff0c;我们可以将这些被迫存在C盘的文件挪到其他盘 但是有的应用无法更改默…

C++ 显示图片

编译环境为codeblocks 20.03&#xff0c;编译器为mingw64非自带的版本&#xff08;版本号多少忘记了&#xff09; 头文件 #include <graphics.h>//图形库 #include <conio.h>//_getch() 显示图片代码 int main() {initgraph(640,360,EX_SHOWCONSOLE);//初始化绘…

我亲身经历的2022年软件质量工作——测试工作的经验总结及一些建议

2022年对于大部分人来说都是辛苦的一年。对于整个社会&#xff0c;疫情反反复复&#xff0c;折磨的每一个人都心力交瘁。 经济下滑&#xff0c;失业率上升似乎听到的都是不好的消息。对于整个互联网行业也频频传出大厂裁员的消息。 而质量团队在大厂的裁员计划里也是首当其冲。…

4)Django模型,表单,视图,路由

目录 一 Django模型 Django ORM 数据库配置 Django 如何使用 mysql 数据库 实例 定义模型 创建 APP 数据库操作 添加数据 获取数据 更新数据 删除数据 二 Django 表单 HTTP 请求 GET 方法 POST 方法 Request 对象 QueryDict对象 三 Django视图 视图层 请求…

Vault的程序侧接入方式-AppRole

前言&#xff1a; 程序侧的接入对于Vault来说也是一种Accessor的接入&#xff0c;而AppRole绝对不是Vault首推的程序侧接入方式&#xff0c;但它是最方便的接入方式。 AppRole的本质是由Vault为程序单独引入一套由Vault托管的鉴权方式&#xff0c;对于安全平台来说没引入一套…

videojs-flvjs:video.js + flv.js播放m3u8和flv视频

videojs-flvjs是video.js的扩展&#xff0c;让video.js支持flv.js播放器&#xff0c;可以在video.js的techOrder里配置flvjs播放器。 下面做了一个切换m3u8和flv直播流的简易工具&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

线程安全(万字详解)

目录 线程安全 概念 用一段代码感受线程安全 线程安全问题的原因 修改上述代码,使其线程安全 synchronized synchronized使用方法 锁对象的规则 synchronized用法,代码展示 monitor lock sychronized的特性 java标准库中的线程安全类 死锁 死锁的常见原因 多个…

LVGL学习笔记9 - 标签Label

目录 1. 显示字符串 1.1 lv_label_set_text 1.2 lv_label_set_text_fmt 1.3 lv_label_set_text_static 2. 设置长字符串模式 3. 改变颜色 3.1 改变背景颜色和对比度 3.2 设置字符串颜色 3.2.1 设置Style的字符串颜色 3.2.2 设置对象的字符串颜色 3.2.3 局部改色 显示…

钧瓷产业将占禹州GDP50%以上,产生千亿市值钧瓷生态型科技公司

这里的上市指沪深的主板&#xff0c;创业板和科创板&#xff0c;区域的挂牌不算。 这个数据是根据禹州钧瓷产业2022年实际税收&#xff0c;综合钧瓷产业报税幅度&#xff0c;钧瓷数据开放平台&#xff0c;钧瓷产业决策内参&#xff0c;钧瓷产业化&#xff0c; 数字化后的预期增…

【CUDA入门笔记】GPU存储结构模型(1)

GPU存储结构模型 1.CPU可以读写GPU设备中的Global Memory、Constant Memory以及Texture Memory内存储的内容&#xff1b;主机代码可以把数据传输到设备上&#xff0c;也可以从设备中读取数据&#xff1b; 2.GPU中的线程使用Register、Shared Memory、Local Memory、Global Mem…

信息时代,企业如何安全管理数据

随着企业信息化的发展&#xff0c;企业所产生的数据量也越来越多&#xff0c;企业数据的存储安全和传输安全管理工作则成为企业数据管理者的重中之重。但是对数据的保护要依靠一定的基础设施&#xff0c;目前&#xff0c;世界各国对数据保护的基础设施建设还是不够完善&#xf…

VSCode搭建ruby开发调试环境

安装rvm rvm是ruby版本管理工具&#xff0c;可以管理本地的ruby的版本 curl -sSL https://get.rvm.io | bash -s stable安装ruby 使用 rvm list known获取已知的ruby版本&#xff0c;这里安装3.0.0版本的ruby rvm install 3.0.0新建ruby文件 在VSCode中新建ruby文件main.r…

【强训】Day1

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 组队竞赛2. 删除公共字符答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下列选项中属于面向对象编程主要特征的是&#xff08;&#xff09; A 继承 B 自顶向下 C 模块化 D 逐步…

【BP靶场portswigger-服务端4】操作系统命令注入-5个实验(全)

目录 一、操作系统命令注入 1、意义 2、有用的命令 3、注入操作系统命令的方式 4、防止操作系统命令注入攻击 二、执行任意命令 1、示例&#xff1a; 实验1&#xff1a;操作系统命令注入&#xff08;简单&#xff09; 三、盲操作系统命令注入漏洞 1、简述 2、示例 3…

Spring Cloud 2022.0.0正式发布:OpenFeign稳得很全面迈向GraalVM

本文已被https://yourbatman.cn收录&#xff1b;女娲Knife-Initializr工程可公开访问啦&#xff1b;程序员专用网盘https://wangpan.yourbatman.cn&#xff1b;技术专栏源代码大本营&#xff1a;https://github.com/yourbatman/tech-column-learning&#xff1b;公号后台回复“…

Vector在CANdb++中关于XCP和应用报文的定义

Vector DBC规则 前文讲解了dbc有关的属性定义与编辑,本文描述在开发过程中关于XCP和应用报文有关的规则说明,方便开发人员正确配置和代码生成所需的属性及其值。 关联文章: dbc的属性定义:dbc的属性定义 Vector DBC属性定义规则:Vector DBC属性定义规则 DBC编辑问题——…

我理解的proc伪文件系统

一.概念 提供可以动态操作Linux内核信息的接口&#xff0c;实现内核空间与用户空间进行数据交换的途径。 二.观察文件内容 //crtlaltt 快速打开Linux终端 //输入一下内容 cd /proc //进入proc文件夹 ls //观察proc文件夹下的内容 cd 2414 //任意打开一个带数字的文件…

【问题解决】解决xshell7会话窗口只能显示一个的问题

这恐怕会成为最短的一篇文章 问题复现 打开多个终端&#xff0c;最终只显示最后一个 如上图&#xff1a; 再打开一个192.168.1.42 &#xff0c;会覆盖掉1.41&#xff0c;终端上先显示最后打开的那个终端。 想要解决xshell7会话窗口只能显示一个的问题&#xff0c;我们只需要…

日志系统:一条SQL更新语句是如何执行的?

前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听 DBA 同事说,…