WINDBG的堆调试分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
WINDBG 的堆调试 HEAP 的概念 堆栈堆栈,在操作系统内存中有两种存储空间,一个是堆,一个是栈。堆主要用于存储用户动态分配的变量,而栈呢,则是存储我们程序过程中的临时变量。当然栈的作用远不止用作存储变量,但这不是我们这篇文章的讨论内容。 堆(HEAP)的分配,使用,回收都是通过微软的 API 来管理的,最常见的 API 是 malloc 和new。在往底层走一点呢,这两个函数都会调用 HeapAlloc(RtlAllocateHeap)。同样的相关函数还有 HeapFree 用来释放堆,HeapCreate 用来创建自己的私有堆。下面是这些函数的调用链: HeapCreate-RtlCreateHeap-ZwAllocateVirtualMemory (这里会直接申请一大片内存,至于申请多大内存,由进程 PEB 结构中的字段觉得,HeapSegmentReserve 字段指出要申请多大的虚拟内存,HeapSegmentCommit 指明要提交多大内存,对虚拟内存的申请和提交概念不清楚的童鞋,请参见 windows 核心编程相关内容~) HeapAlloc-RtlAllocateHea(p 至于这里申请的内存,由于HeapCreate 已经申请了一大片内存, 堆管理器这片内存中划分一块出来以满足申请的需要。这一步申请操作是堆管理器自己维护的,仅当申请内存不够的时候才会再次调用ZwAllocateVirtualMemory ) HeapFree-RtlFreeHeap (对于释放的内存,堆管理器只是简单的把这块内存标志位已释放让后加入到空闲列表中,仅当空闲的内存达到一定阀值的时候会调用ZwFreeVirtualMeMory ) HeapDestroy-RtlDestroyHeap-ZwFreeVirtualMeMory (销毁我们申请的堆) 如何找到我们的 HEAP 信息? WINDBG 观察堆 源码: #include windows.h int main() { HANDLE heap_handle = HeapCreate( NULL , 0x1000 , 0x2000 ) ; char *buffer = (char*)HeapAlloc(heap_handle , NULL , 128) ; char *buffer1 = (char*)HeapAlloc(heap_handle , NULL , 121) ; HeapFree(heap_handle, 0 , buffer ) ; HeapFree(heap_handle, 0 , buffer1 ) ; HeapDestroy( heap_handle) ; return 0 ; } 该源码生成编译生成 heap.exe,然后用 windbg 调试这个程序,在 main 函数下断,紧接着执行第五行语句,执行结果如下 0:000 p eax=002e1ca0 ebxecx=6d29b6f0 edxesiedieip esp=0022fe8c ebp=0022feac iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 eflheap!main+0x12:ff150c200301 call dword ptr [heap!_imp HeapCreate (0103200c)] ds:0023:0103200c={kernel32!HeapCreateStub (769a29d7)} 0:000 p eax=002c0000 ebxecxedxesiedieip esp=0022fe98 ebp=0022feac iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 eflheap!main+0x18:8945fc mov dword ptr [ebp-4],eax ss:0023:0022fea8=6d222201 0:000 !heap Index Address Name Debugging options enabled 1:2:3:4: 002e0000 5: 002c0

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档