堆的调试实验

  • 调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实

  • 使用调试器加载函数会触发前者

  • __asm int3 调试最真实的栈

  • 未启用块表的堆区信息

  • 堆区起始位置(假设为0x00520000)

  • 起始位置开始依次是段表索引,虚表索引,空表使用标识和空表索引区

  • 空表索引区的位置是偏移0x178处

  • 一个堆刚刚初始化时堆块的状态:

    • 只有一个空闲的大块(尾块)
    • 位于堆偏移0x0688处(启用块表后这个位置将是快表)(忽略掉8字节块首)
    • Freelist[0]指向尾块
    • 处零号空表索引外其余均指向自己,其余的空闲链表中都没有空闲堆块



  • 块首:8字节

  • 调试实验中堆分配的细节

    (1)堆块的大小包括了块首在内,即如果请求 32 字节,实际会分配的堆块为 40 字节:8

    字节块首+32 字节块身。

    (2)堆块的单位是 8 字节,不足 8 字节的部分按 8 字节分配。

    (3)初始状态下,快表和空表都为空,不存在精确分配。请求将使用“次优块”进行分配。

    这个“次优块”就是位于偏移 0x0688 处的尾块。

    (4)由于次优分配的发生,分配函数会陆续从尾块中切走一些小块,并修改尾块块首中的

    size 信息,最后把 freelist[0]指向新的尾块位置。(找零钱)

  • 块表的状态HeapCreat(0,0,0)

  • 变化:

    • 尾块不再是0x0688偏移处,通过0x0178Freelist[0]处可以看出
  • 堆刚初始化时块表是空的

  • 申请8,16,24字节的堆空间再释放后:

    • 之前0x0688处

    • 释放后:

  • 空表和块表堆块区别

  • 块首只存指向下一堆块的指针,不存在指向前一堆块的指针

  • 块首中的标识位为 0x01,也就是这个堆块是 Busy 状态

最新文章

  1. UVA1586
  2. 【C++实现python字符串函数库】strip、lstrip、rstrip方法
  3. 优先使用最新版本的IE 和 Chrome 内核 1 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  4. 跟服务器交互的Web表单(form)
  5. GL_GL系列 - 会计期间管理分析(案例)
  6. MVC 的知识
  7. typdef struct 语法
  8. Javascript自执行匿名函数(function() { })()的原理浅析
  9. 国外成熟的程序交易系统的思路 z
  10. c++适配器模式
  11. Codeforces 474 F. Ant colony
  12. 极路由1s,固件需要刷入RipOS系统的加40块
  13. Android中与task相关的几个属性
  14. 《深入理解Java虚拟机》学习笔记(二)
  15. MySQL查询所有数据库表出错
  16. SpringMVC中post请求参数注解@requestBody使用问题
  17. UOJ219 NOI2016 优秀的拆分 二分、字符串哈希
  18. myBatis外部的resultMap高级应用
  19. table border
  20. css3的一个小demo(箭头hover变化)

热门文章

  1. 小案例带你揭秘JS事件
  2. C 神奇项链
  3. B【SDOI2008】Sandy的卡片
  4. (C++ Error: Incompatible types in assignment of ‘char*’ to ‘char [2])
  5. VBScript - 弹出“文件选择对话框”方法大全!
  6. http的部署和使用
  7. 在Android Studio中导入jar包
  8. SpringMVC(二):使用注解开发
  9. 家庭版记账本app开发进度。开发到现在整个app只剩下关于图表的设计了,具体功能如下
  10. Linux 任务管理篇(一)