知识这东西有时候很奇怪,每次当你重新审视他的时候可能都会有新的收获。最近为了研究一个内存相关的问题,把windows heap相关的内容又复习了一遍,收获不小,记录一下,希望有朋友使用的时候少走些弯路。

老话说的好,知己知彼方可百战不殆,没准备就去打仗无异于以卵击石,后果可想而知,那分析heap的问题需要什么基础知识呢:

1.       Windows 基础知识,内存模型,什么是堆,堆内存是如何管理的,不了解的,建议学习<windows internals>。

2.       如何调试相关的问题,如何选择工具,建议学习windbg相关的命令。

3.       如何配置系统,如何启动页堆,如何使用gflag。

4.       相关的反汇编知识。

5.       知道如何能找到有用的信息。

好吧,以一个例子来说明:

void CTestPHeapDlg::OnBnClickedOk()

{

char * p;

HANDLE hHeap;

hHeap = HeapCreate(0, 1024, 0);

p=(char*)HeapAlloc(hHeap, 0, 9);

}

假设代码如上,点击一下,分配一次内存,同时假设代码很长,无法通过代码审查发现在那分配额的内存,如下的步骤可以帮你找到在哪分配的内存:

1. 对这个程序配置gflag开启完全页堆。

2. windbg调试器下运行程序。

3. 执行如下步骤:

0:001> !heap -p

Active GlobalFlag bits:

hpa - Place heap allocations at ends of pages

StackTraceDataBase @ 00430000 of size 01000000 with 00000378 traces

PageHeap enabled with options:

ENABLE_PAGE_HEAP

COLLECT_STACK_TRACES

active heaps:

+ 170000

ENABLE_PAGE_HEAP COLLECT_STACK_TRACES

NormalHeap - 270000

HEAP_GROWABLE

0:001> !heap -p -h 170000

_DPH_HEAP_ROOT @ 171000

Freed and decommitted blocks

DPH_HEAP_BLOCK : VirtAddr VirtSize

00174a3c : 0284f000 00002000

00174ba4 : 02851000 00002000

00174b7c : 02853000 00002000

00174b04 : 02855000 00002000

001749ec : 02857000 00002000

00174ab4 : 02859000 00002000

001749c4 : 0285b000 00002000

00173d1c : 0285d000 00002000

0017494c : 0285f000 00002000

00173d94 : 02861000 00002000

0017499c : 027e4000 00002000

Busy allocations

DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize

001744ec : 0282ffe0 00000020 - 0282f000 00002000

001741a4 : 0282dfe0 00000020 - 0282d000 00002000

00174a14 : 028b1ff0 00000010 - 028b1000 00002000

001726ec : 025e8fd8 00000024 - 025e8000 00002000

MSCTF!CSharedBlockNT::`vftable'

00172714 : 025e4ff8 00000008 - 025e4000 00002000

00174a64 : 0289bfe0 00000020 - 0289b000 00002000

00174a8c : 02899fe0 00000020 - 02899000 00002000

001743ac : 0284bff0 0000000c - 0284b000 00002000

00174384 : 02849f88 00000074 - 02849000 00002000

00174334 : 02845f88 00000074 - 02845000 00002000

001742e4 : 02841f88 00000074 - 02841000 00002000

0017124c : 00186ce8 00000314 - 00186000 00002000

00171224 : 00184ce8 00000314 - 00184000 00002000

001711fc : 00182d28 000002d8 - 00182000 00002000

001711ac : 0017efd0 0000002d - 0017e000 00002000

0017115c : 0017afd8 00000022 - 0017a000 00002000

_HEAP @ 270000

_HEAP_LOOKASIDE @ 270688

_HEAP_SEGMENT @ 270640

CommittedRange @ 270680

HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state

* 00270680 0301 0000 [01]   00270688    01800 - (busy)

00271e88 022f 0301 [10]   00271e90    01170 - (free)

VirtualAllocdBlocks @ 270050

0:001> dt _DPH_BLOCK_INFORMATION 0282ffe0-0x20

ntdll!_DPH_BLOCK_INFORMATION

+0x000 StartStamp       : 0xabcdbbbb

+0x004 Heap             : 0x00171000

+0x008 RequestedSize    : 0x20

+0x00c ActualSize       : 0x1000

+0x010 FreeQueue        : _LIST_ENTRY [ 0x359 - 0x0 ]

+0x010 TraceIndex       : 0x359

+0x018 StackTrace       : 0x028c271c

+0x01c EndStamp         : 0xdcbabbbb

0:001> dds 0x028c271c

028c271c abcdaaaa

028c273c 7c94b244 ntdll!RtlAllocateHeapSlowly+0x44

028c2740 7c919c0c ntdll!RtlAllocateHeap+0xe64

028c2744 7c9114d6 ntdll!RtlpAllocateDebugInfo+0x49

028c2748 7c911566 ntdll!RtlInitializeCriticalSectionAndSpinCount+0xa9

028c274c 7c91162c ntdll!RtlInitializeCriticalSection+0xf

028c2750 7c96b97c ntdll!RtlpDebugPageHeapCreate+0x191

028c2754 7c93bd16 ntdll!RtlCreateHeap+0x41

028c2758 7c812c9f kernel32!HeapCreate+0x55

028c275c 004136d4 TestPHeap!CTestPHeapDlg::OnBnClickedOk+0x34 [f:\democode\testpheap\testpheap\testpheapdlg.cpp @ 158]

028c2760 78aad602 mfc90ud!_AfxDispatchCmdMsg+0xb2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 82]

028c2764 78aadd4a mfc90ud!CCmdTarget::OnCmdMsg+0x2ea [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp @ 381]

028c2768 78a83a13 mfc90ud!CDialog::OnCmdMsg+0x23 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp @ 85]

028c276c 78a45994 mfc90ud!CWnd::OnCommand+0x174 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 2364]

028c2770 78a44609 mfc90ud!CWnd::OnWndMsg+0x79 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1769]

028c2774 78a44552 mfc90ud!CWnd::WindowProc+0x32 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 1755]

028c2778 78a41970 mfc90ud!AfxCallWndProc+0xf0 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp @ 240]

028c277c abcdaaaa

看到结果了吧?如下的callstack正是内存分配时的栈,希望对大家有所帮助。

028c271c abcdaaaa

028c273c 7c94b244 ntdll!RtlAllocateHeapSlowly+0x44

028c2740 7c919c0c ntdll!RtlAllocateHeap+0xe64

028c2744 7c9114d6 ntdll!RtlpAllocateDebugInfo+0x49

028c2748 7c911566 ntdll!RtlInitializeCriticalSectionAndSpinCount+0xa9

028c274c 7c91162c ntdll!RtlInitializeCriticalSection+0xf

028c2750 7c96b97c ntdll!RtlpDebugPageHeapCreate+0x191

028c2754 7c93bd16 ntdll!RtlCreateHeap+0x41

028c2758 7c812c9f kernel32!HeapCreate+0x55

028c275c 004136d4 TestPHeap!CTestPHeapDlg::OnBnClickedOk+0x34

Windows代码heap内存分析实战的更多相关文章

  1. android--------Eclipse中ddms heap内存分析工具

    无 论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方. Android tools中的DDMS就带有一个很不错的内存监测工具Heap ...

  2. Eclipse CDT Linux下内存分析 实战历险

    C++产品开发,上线集成时,都需要内存泄露.覆盖率等检测,这些在Windows下都有很好的工具,如 Visual Studio: 这个内置了很多的工具 Devpartner: VC6时BoundChe ...

  3. iOS开发——高级篇——内存分析,Instruments

    一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...

  4. Ruby入门--Linux/Windows下的安装、代码开发及Rails实战

    Ruby入门--Linux/Windows下的安装.代码开发及Rails实战 http://www.linuxidc.com/Linux/2014-04/100242.htm Ubuntu 13.04 ...

  5. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  6. Windows系统内存分析工具的介绍

      Windows系统内存分析工具的介绍(进程管理器,资源管理器,性能监视器, VMMap, RamMap,PoolMon) 微软官方提供多种工具来分析Windows 的内存使用情况,除了系统自带的任 ...

  7. Android内存泄漏分析实战

    内存泄漏简单介绍 java能够保证当没有引用指向对象的时候,对象会被垃圾回收器回收.与c语言自己申请的内存自己释放相比,java程序猿轻松了非常多.可是并不代表java程序猿不用操心内存泄漏.当jav ...

  8. 恶意代码分析实战五:OllyDebug动态结合

    目录 恶意代码分析实战五:OllyDebug动态结合 OllyDebug界面介绍 OllyDebug载入程序方法 OllyDebug地址跳转 OllyDebug下断点 OllyDebug单步执行 Ol ...

  9. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

随机推荐

  1. IIS文件存在但报404问题解决

    遇到一个奇怪的问题,在IIS7.5中,一些样式和JS文件存在,但访问就是报404. 根据网上搜索到的解决方法,发现解决不了,不同同样的问题引起的. 网上解决: 1.没有配置合适的MIME信息,通过添加 ...

  2. Iahub and Permutations(codeforces 314c)

    题意:给出一组排列,某些位置不知道(-1),要求求出有多少种还原方式,使得所有a[i]!=i /* 这是一道关于排列的动态规划,这种体大都可以当作棋盘来做,如果把i这个数放到第j个位置,那么就将棋盘的 ...

  3. x1 carbon 扩展屏 模糊

    x1 carbon 扩展屏 模糊,扩展屏是dell的屏,分辨率最大是1920*1080, x1最大是2560*1440. 不论是通过DP mini转VGA,还是HDMI,输出都是模糊,只有复制屏幕的时 ...

  4. 一致性哈希算法-----> 解决memecache 服务器扩容后的数据丢失。

    1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...

  5. HDU——1054 Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. POJ 2337 【字典序】【欧拉回路】

    题意: 给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排. 如果有多组解,输出字典序最小的一组解. 这题... WA了两天. 错误有以下: 1.没有初始化好起始位置,默认起始位置是a了 ...

  7. androidstudio Cannot resolve symbol 'xxx'

    Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题.鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 ...

  8. Node.js+Web TWAIN,实现Web文档扫描和图像上传

      目录(?)[+] 通过Dynamic Web TWAIN SDK和Node.js的组合,只需要几行代码就可以实现在浏览器中控制扫描仪,获取图像后上传到远程服务器. 原文:Document Imag ...

  9. 【Todo】STAR面试法

    今天在面试培训的时候,接触到了STAR面试法. 觉得挺好的,用来准备非技术面试,还蛮全面的.所以可以多了解一下. 可以参考:http://www.hrloo.com/rz/73652.html

  10. 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut

    聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster ...