使用.debug_info调试信息查看结构体、位域变量内存分配

2023-11-07

       上一篇使用readelf查看了.debug_info调试信息,现在我们对它进行分析。首先将调试信息保存到文档中:
readelf -wi test > out.txt

结构体分析

       首先,我在结构体里定义了一个char型和一个double型,编译连接后查看调试信息,然后改变结构体中成员类型,查看内存分配方式。
1. 在调试信息中找到main函数,可以看到main函数前面的<1>表示他是第一级。DW_AT_frame_base表示栈指针的位置。DW_AT_low_pc和DW_AT_high_pc表示这段程序的开始和结束位置。紧接着往下看,可以看到一个块,就是<2>处。再往下就可以看到快里面有我定义的一个结构体:blabla。DW_OP_plus_ fbreg:-32表示栈指针减去32就可以得到该变量的位置。
这里写图片描述
2. 根据DW_AT_type即变量的类型:0x1353在调试信息里面找。如图:
这里写图片描述

可以看到,这个结构体大小是16个字节。第一个成员名字是a,它的内存从结构体开始处分配,在调试信息里找它的类型,可以看到它是char型,大小是一个字节:
这里写图片描述
第二个成员b,它的内存从结构体的第8个字节开始处分配,查看它的类型是double 型,8个字节:
这里写图片描述
说明分配内存时为了对齐,虽然char类型只占1个字节,但是一个double类型8个字节,没法补到剩余的7个字节去,所以空出了7个字节。
3. 改变结构体成员定义顺序,先定义double,后定义char,结果一样:
这里写图片描述
4. 接着我将结构体成员类型改为char 和 int,查看结果:

这里写图片描述
a是char,b是int
这里写图片描述
同样为了对齐将char后面的三个字节空了出来。
5. 将结构体成员类型定义为int 和double:
这里写图片描述
int后面的4个字节空出。
6. 再重新定义成员为:char,int,double。发现并不是将char和int后面的都空出来,而是将char后面空出三个字节,相当于补成和int一样的4字节,然后二者合起来正好8字节对齐。
这里写图片描述
7. char,char,double:发现第二个char紧接着第一个char,然后又空出6个字节,和double对齐。
这里写图片描述
8. char,double,char:此时发现由于两个char没有在一起定义,因此第一个char占用一个字节,后面7个字节都空着,为了和double对齐,第二个char同理。这两种结构体看起来大小一样,但实际上这种定义方式比上一种要占用更大的空间,
这里写图片描述
9. 接着我在这个结构体里定义了另一个结构体e,e结构体包含3个double成员,查看结果:
c是char型,e是结构体,大小是24字节,char按照double对齐。

这里写图片描述
10. 将e结构体定义为double,int,测试发现char按照double对齐:
e结构体:
这里写图片描述
测试结构体:
这里写图片描述
结论:对于结构体变量,要按照结构体最大的基本数据类型进行对齐。结构体变量按顺序分配变量,分配完一个成员后,如果刚好占了对齐字节大小,则下一个继续分配,如果占不够对齐字节大小,则看下一个成员的大小是否可以填在它空出的字节处,如果可以,则跟着存储,否则空出剩余字节,重新分配新的字节,保证对齐。

位域分析

  1. Zh_t包含两个int位域,w是5位,w1是4位, 可以看到该结构体大小是4个字节。并且w和w1是连续存储,字节区块都是0.
    这里写图片描述
  2. char5位和int4位,大小仍是4字节,依旧连续存储。
    这里写图片描述
  3. char2位和char4位,大小是1个字节,连续存储。
    这里写图片描述
  4. w-char2位和w1-char4位,w2-char3位,大小是2个字节,w和w1是连续存储,但是由于char占用1个字节存储,w和w1占了6位,剩余2位,w2没法全部填满到这一字节,因此空出2位,存放到下一个字节。
    这里写图片描述
    结论:结构体里的位域按照最大的类型分配内存,如果没有超出最大类型的字节数,则永远连续分配;如果发现内存未分配的剩余的位数不够新成员的位数,则空出剩余位数,重新分配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用.debug_info调试信息查看结构体、位域变量内存分配 的相关文章

  • Tomcat debug模式启动

    在 CATALINA HOME bin startup bat中添加以下任意一行配置 SET JAVA OPTS Xdebug Xrunjdwp transport dt socket address 8787 server y suspe
  • windows下各调试器条件断点实例

    0x00 前言 发现网上很多关于ollydbg和windbg的条件断点的设置是错误的 所以这里总结下 0x01 字符串条件断点 ollydbg unicode字符串 bp kernel32 CreateFileW UNICODE esp 4
  • GDB+GDBserver 远程调试

    本文转自 https www cnblogs com Dennis mi articles 5018745 html 如若侵权 会及时删除 内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成 两者通过串口或TCP连接 使用 G
  • VS2010调试-显示堆栈窗口

    以中断模式或运行模式显示 调用堆栈 窗口 在 调试 菜单中选择 窗口 然后单击 调用堆栈 或者 ALT 7 更改显示的可选信息 右击 调用堆栈 窗口 然后设置或清除 显示 lt 所需信息 gt 在 调用堆栈 窗口中显示非用户代码帧 右击 调
  • Linux下嵌入式程序仿真调试(GDB)(二)

    目录 目录 前言 Ubuntu下Qt的GDB环境搭建未成功 Qt5的设置 命令行调试问题记录 总结 链接地址 前言 Linux下嵌入式程序仿真调试 GDB 一 主要介绍了GDB交叉调试环境的搭建过程 本想把交叉编译好的gdb程序放置到Qt中
  • 《软件调试艺术》读后感七

    1 线程调试 对线程的调试用的最多的可能是thread命令了 查看程序中有多少线程使用Infothreads 进入到某个线程的内部使用thread count 这样就可以进入到count线程的内部 线程调试中用的最多的还有就是bt命令 这个
  • 【VS2010学习笔记】【异常处理】一(无法启动此程序,因为计算机中丢失libiconv-2.dll)

    问题1 无法启动此程序 因为计算机中丢失libiconv 2 dll 问题描述 在VS2010 Opencv2 4 7的程序调试的过程中 再点击 运行 后 系统提示 无法启动此程序 因为计算机中丢失libiconv 2 dll 自己在调试的
  • 使用spyder3调试python程序的简明教程

    说是简明教程 其实是我自己尝试用spyder调试python程序的过程的一个记录 因为spyder的调试功能是基于pdb 而我又没有pdb的基础 所以刚开始上手时感觉很不习惯 而且那时我又很懒 没去找官方文档 仅仅在百度和csdn上找了找
  • 远程调试(Remote Debugging)

    当运行的程序出现问题时 我们通常通过调试来追踪和定位问题 但是 当运行错误的机器上没有调试工具 我们就需要实现远程调试 简单地说 就是要调试的程序和调试器不在一台机器上 移动端web调试 alert虽然是个土方法 但也是万能的 不过这样会中
  • Xcode8不能在iOS7上调试,Could not find Developer Disk Image的解决方法

    升级完Xcode8之后 默认情况下 是无法进行iOS7的调试的 因为Xcode8里面不再游iOS7的镜像文件 所以会提示 Could not find Developer Disk Image 解决方法如下 打开finder 应用程序 Xc
  • 原来gdb的底层调试原理这么简单

    一 前言 这篇文章来聊聊大名鼎鼎的GDB 它的豪门背景咱就不提了 和它的兄弟GCC一样是含着金钥匙出生的 在GNU的家族中的地位不可撼动 相信每位嵌入式开发工程师都使用过gdb来调试程序 如果你说没有用过 那只能说明你的开发经历还不够坎坷
  • valgrind Massif

    valgrind检查内存泄露 valgrind 程序 内存泄漏问题 我们有memcheck工具来检查 很爽 但是有时候memcheck工具查了没泄漏 程序一跑 内存还是狂飙 这又是什么问题 其实memcheck检查的内存泄漏只是狭义的内存泄
  • 你开发的软件不知道哪里跑飞闪退了?这个办法可以帮忙定位(查看dump)

    QT生成dump pdb文件 使用windbg打开分析查看堆栈 定位程序崩溃位置 你开发的软件不知道哪里跑飞闪退了 这个办法可以帮忙定位 https zhuanlan zhihu com p 102103083
  • 【Visual Studio】调试过程中VS卡死无响应

    最近在使用vs2022 debug调试过程中 经常出现vs2022直接卡死无响应 解决方案 第一种原因 是加载符号导致 调试 选项 符号 1 取消勾选 xxx 符号服务器 2 选择 仅加载指定的模块 第二种情况 VS卡死后 把崩溃dmp导出
  • 在dos下使用debug被提示incorrect ms dos version的解决办法

    原创 在dos下使用debug被提示incorrect ms dos version的解决办法 首先可以确定一点 直接使用debug时它是直接在当前目录下寻找的 一旦当前目录下没有debug或debug版本不合适 则会出错 直接在 开始 中
  • 远程调试Android/IOS设备/微信网页方法汇总

    以下汇总现在可远程调试手机网页的几个方法 基本上官方都有详细的说明文档 可移步至相关网站查看 这里就不赘述使用 操作方法了 微信web开发者工具 PC客户端 官方说明文档 支持Windows和Mac系统 支持调试Android和IOS设备
  • GDB调试技巧实战--为release程序加载符号

    问题 内存数据分析是开发人员的重要技能 特别是对于C C 程序员而言 微软表示 微软每年分配的CVE中有70 仍然是内存安全问题 内存数据就像事故现场 人们可以在其中发现内存数据重叠或损坏的内存数据 从而可能提供有价值的洞察力 揭示问题的根
  • 转载--Windows下比较两个不同版本的二进制文件

    接手前人的软件 发现主程序依赖的动态库文件的源码没有包含在工程里面 花了好长时间找到了源代码 但是不知道它是不是最新版本的源代码 发现现有用到的动态库有两个版本的 其中一个修改时间旧一点的动态库文件在源代码的Release目录中可以找到 可
  • Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法

    Xcode5 1默认不支持iOS5版本的模拟器开发调试 在OS X Mavericks 10 9 x 下默认只能支持iOS6 1及以上版本的模拟器 在OS X Mountain Lion 10 8 x 下默认只能支持iOS6 0及以上版本的
  • 出现( linker command failed with exit code 1)错误总结

    这种问题 通常出现在添加第三方库文件或者多人开发时 这种问题一般是找不到文件而导致的链接错误 我们可以从如下几个方面着手排查 1 以如下错误为例 如果是多人开发 你同步完成后发现出现如下的错误 Undefined symbols for a

随机推荐

  • java的两种比较器

    比较算法 日常生活中 如果想比较两个数的大小 可采用做差的方式 做差结果的正负可用来判断两个数的大小 假设A B C 若整数C gt 0 说明 A gt B 若整数C 0 说明 A B 若整数C lt 0 说明 A lt B java的两种
  • 求子数组问题

    子数组问题分为三类 1 连续子数组 2 非连续子数组 3 可连续也可以不连续 这三类问题的解决办法一般都是循环或者动态规划 尝试了dfs算法 结果把自己给绕进去了 一 最大升序问题 属于第三类 参考 https www cnblogs co
  • Controlling Font Size With Javascript 兼容主流浏览器

  • 简单的递归组件示例-vue3

    1 呈现效果 2 代码实现 2 1 src App vue 代码
  • 送呆萌的她一个皮卡丘(Python实现)

    目录 1 呆萌的她 2 思维需要革新 3 送她的一个漂亮皮卡丘 4 Python完整代码奉上 1 呆萌的她 又是一季春风暖阳下 你是一湾一湾羞涩的春波 静静感受着 你垂下的枝膊 在我的脸上轻轻抚摸 一对春燕 低低掠过 涟漪乍起 是你浅浅的笑
  • 计算机的性能公式

    cpu执行时间 简称CPU时间 表示执行某一任务在CPU上所花费的时间 不包括等待I O或运行其他程序的时间 程序的cpu执行时间 cpu时钟周期数 时钟周期时间 cpu时钟周期数 主频 要想缩短cpu执行时间 最简单的方法就是缩短cpu的
  • 连表查询可以跟多个条件

    连表查询时后面条件可以跟多个条件 select from tabA a tabB b where a userID b userID and a userName b userName select from tabA a left joi
  • 基于JWT(JSON Web Token)的工程引入与落地实践

    JWT从认识 起飞到落地 1 JWT认识 1 1 什么是JWT 1 2 透明令牌与自包含令牌 2 JWT起飞 2 1 JWT的用处 2 2 JWT的原理 2 3 JWT的结构 2 3 1 JWT头 2 3 2 有效载荷 2 3 3 签名哈希
  • C语言中数组所占字节怎么算

    数组在内存中所占字节数可以使用sizeof操作符来计算 该操作符是专门用于检测类型或变量或数组在内存中所占有的空间 字节数 语法 sizeof x 其中x是类型名 变量名或数组名等 可以返回x所占字节数 C语言中计算一个数组占内存多少空间
  • 翻斗式雨量计的组成与工作原理

    雨量计也叫雨量记录仪 量雨计 测雨计 是常规的气象检测仪器 气象部门通过它来监测计量降雨量和降雨强度 常见的有虹吸式雨量计 翻斗式雨量计和称重式雨量计等 因为翻斗式雨量计方便携带安装 数据相对精确 因此在农业气象监测中广泛应用 1 翻斗式雨
  • lua的coroutine

    编辑器是IDEA lua协程学习汇总 lua协程 可以使用debug模式一步步查看程序的运行 coroutineFunction function a b coroutine yield 挂起正在运行的协程 传递给yield的参数将成为re
  • 墨者靶场(综合)

    初级 综合 表单暴力破解实训 第1题 提示 直接使用BurpSuite抓包跑数字 HTML前端代码分析 暗链 提示 打开页面 访问得到key值 SVN信息泄露漏洞分析 第1题 背景介绍 提示 1 使用dirsearch扫描地址 2 使用Na
  • click house索引

    稀疏索引 好处 范围查询过滤比较快 弊端 不适合点对点查询 索引必须依赖物理存储顺序 排序字段a b c 索引字段 a ab abc 索引字段必须是排序字段的前缀 语句级多线程 由于一条数据 不适合高qps的高频短查询 更适合低频的大数据复
  • PCL DBSCAN密度聚类

    目录 一 算法原理 1 密度聚类 2 参考文献 二 代码实现 三 结果展示 四 附 matlab验证代码 一 算法原理 1 密度聚类 密度聚类是将簇定义为密度相连的点的最大集合 能够把具有足够高密度的区域划分为簇 并可在噪声的空间数据库中发
  • Android面试常用面试题

    1 Android手机横竖屏切换的问题及其解决方案 默认情况下 横竖屏切换的时候 系统会销毁当前的Activity 然后新建一个Activity 显然 太浪费资源了 http www cnblogs com zhangkai281 arch
  • 机器学习(machine learning)之AdaBoost算法

    转载自 http blog csdn net haidao2009 article details 7514787 菜鸟最近开始学习machine learning 发现adaboost 挺有趣 就把自己的一些思考写下来 主要参考了http
  • TCP吞吐量的理论计算公式

    源 本篇文章本来是收录AIMD拥塞控制吞吐量的计算公式 Valve游戏公司开源GameNetworkingSockets 1 既支持可靠的数据传输 也支持不可靠的数据传输 数据的传输速率 是直接计算出来的 const int64 k nMi
  • HDLBits刷题_Verilog Language_Module pos

    学习内容 This problem is similar to the previous one module You are given a module named mod a that has 2 outputs and 4 inpu
  • 2019年TI电赛总结

    本人某不知名大学菜鸡一个 近几年比赛分析 首先 TI公司承办了未来好几年的电子设计竞赛 TI杯近几年出题还是很有技术的 省赛好多题目可以说是为国赛做准备的 所以想要参加国赛取得好成绩的同学 就要提前参加省赛或者做一做省赛的相关题目 之前不是
  • 使用.debug_info调试信息查看结构体、位域变量内存分配

    上一篇使用readelf查看了 debug info调试信息 现在我们对它进行分析 首先将调试信息保存到文档中 readelf wi test gt out txt 结构体分析 首先 我在结构体里定义了一个char型和一个double型 编