• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-03-21 08:36 Aet 隐藏边栏 |   抢沙发  6 
文章评分 2 次,平均分 5.0

调试实践

关于调试实践。

内存破坏

栈内存

  1. 在Windows中,栈只是操作系统为线程分配的一块内存。
  2. 作用是记录函数调用链(局部变量的分配、参数传递)。
    1. 每当调用函数时,都会创建一个栈帧并且把它压入到栈中。
    2. 随着线程中调用的函数越来越多,栈也会变得越来越大。

函数结构

  1. 函数前导指令
    1. 确保为将要执行的函数建立起正确的栈
  2. 函数代码
  3. 函数后继指令
    1. 确保在返回到调用者之前将栈恢复到正确的状态、

调用约定

  1. stdcall
    1. 从右向左
    2. 被调函数负责栈的清理工作
  2. cdecl
    1. 从右向左
    2. 主调函数负责栈的清理工作
  3. fastcall
    1. 从右向左,前两个参数是通过ecx和edx寄存器传递的
    2. 被调函数负责栈的清理工作
  4. thiscall
    1. 从右向左
    2. 被调函数负责栈的清理工作

堆内存

  1. 在Windows中,堆是一种内存管理器
  2. 程序可以通过堆来动态分配和释放内存
  3. 当进程启动时,堆管理器将自动创建一个新堆,叫做默认的进程堆
  4. 虽然在一些进程中会使用默认的进程堆,但大多数的其他进程是通过CRT堆(new/delete已经malloc/free)来满足关于内存的需求
  5. 有的进程还会创建一个额外的堆(通过HeapCreate)将进程中不同的组件独立开来

前端分配器

  1. 程序中存在一些密集的内存分配操作,可以使用低碎片的前端分配器来避免产生内存碎片
  2. 在Windows中有两种前端分配器
    1. 旁视列表前端分配器(LAL)
    2. 低碎片(LF)

后端分配器

  1. 如果前端分配器无法满足分配请求,那这个请求会被转发到后端分配器

关于命令

  1. 命令dc将指针的内存内容转储出来
  2. 命令!address将可以收集关于内存的信息
  3. 命令dds将内存转储为双字或符号
  4. 命令dpp将对指针解引用
  5. 命令dpa将指针执行的内存显示为ASCII格式
  6. 命令dpu将指针指向的内存显示为Unicode格式

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享