调试实践
关于调试实践。
内存破坏
栈内存
- 在Windows中,栈只是操作系统为线程分配的一块内存。
- 作用是记录函数调用链(局部变量的分配、参数传递)。
- 每当调用函数时,都会创建一个栈帧并且把它压入到栈中。
- 随着线程中调用的函数越来越多,栈也会变得越来越大。
函数结构
- 函数前导指令
- 确保为将要执行的函数建立起正确的栈
- 函数代码
- 函数后继指令
- 确保在返回到调用者之前将栈恢复到正确的状态、
调用约定
- stdcall
- 从右向左
- 被调函数负责栈的清理工作
- cdecl
- 从右向左
- 主调函数负责栈的清理工作
- fastcall
- 从右向左,前两个参数是通过ecx和edx寄存器传递的
- 被调函数负责栈的清理工作
- thiscall
- 从右向左
- 被调函数负责栈的清理工作
堆内存
- 在Windows中,堆是一种内存管理器
- 程序可以通过堆来动态分配和释放内存
- 当进程启动时,堆管理器将自动创建一个新堆,叫做默认的进程堆
- 虽然在一些进程中会使用默认的进程堆,但大多数的其他进程是通过CRT堆(new/delete已经malloc/free)来满足关于内存的需求
- 有的进程还会创建一个额外的堆(通过HeapCreate)将进程中不同的组件独立开来
前端分配器
- 程序中存在一些密集的内存分配操作,可以使用低碎片的前端分配器来避免产生内存碎片
- 在Windows中有两种前端分配器
- 旁视列表前端分配器(LAL)
- 低碎片(LF)
后端分配器
- 如果前端分配器无法满足分配请求,那这个请求会被转发到后端分配器
关于命令
- 命令
dc
将指针的内存内容转储出来 - 命令
!address
将可以收集关于内存的信息 - 命令
dds
将内存转储为双字或符号 - 命令
dpp
将对指针解引用 - 命令
dpa
将指针执行的内存显示为ASCII格式 - 命令
dpu
将指针指向的内存显示为Unicode格式
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Windows 核心编程 _ 内核对象:线程同步二07/30
- ♥ Windows系统学习一03/21
- ♥ Windows 核心编程 _ 线程优先级与关联性07/09
- ♥ Windows 核心编程 _ 线程调度07/07
- ♥ WTL 概述03/10
- ♥ Windows消息处理机制04/29