学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题

[转载图文] Windbg 查内存占用

发表于 2023-10-31 13:36:05 | 查看: 1426| 回复: 5

Windbg 查内存占用

Windbg 查内存占用
内存类型
即Type值,共有四种:第一种是什么都不是,即尚未被使用的;
                                     第二种是MEM_IMAGE,即地址映射于一个可执行镜像文件片段,如DLL文件;
                                     第三种是MEM_ MAPPED,即地址映射于不可执行的镜像文件片段,如页文件;
                                     第四种是MEM_PRIVATE,即私有有内存,这里的私有是针对进程而言的,私有内存无法在多个进程间共享;

保护模式:即Protect值,上例中见识了两种保护模式,
NOACCESS和READWRITE。从字面即很容易理解其意思,前者是不能做任何访问的,因为空闲内存是无效内存;后者则可读可写,但不能执行,说明是保存数据的地方。所有可用的保护包括:PAGE_NOACCESS(不可访问),PAGE_READONLY(只读),PAGE_READWRITE(读写),PAGE_EXECUTE(可执行), PAGE_EXECUTE_READ(执行并可读),PAGE_EXECUTE_READWRITE(执行并可读写),PAGE_WRITECOPY(写时拷贝),PAGE_EXECUTE_WRITECOPY(执行,并写时拷贝), PAGE_GUARD(保护)
内存用途:即Usage值,有这样一些值和用途。RegionUsageIsVAD:表示此地址区域已被分配;RegionUsageFree:代表此地址区域已被释放,既没有保留也没有被提交,将来可以申请使用;
  • RegionUsageImage:代表此地址区域被映射到二进制文件的镜像;Region UsageStack:代表此地址区域用于线程栈;RegionUsageTeb:代表此地址区域用于保存目标进程的所有线程的TEB结构;
  • RegionUsageHeap:代表此地址区域用于堆内存;RegionUsage Pdb:代表此地址区域用于保存目标进程的PEB结构;RegionUsageProcessParameters:代表此内存块用于保存目标进程的启动参数;
  • RegionUsageEnviromentBlock:代表此地址区域用于保存目标进程的环境块

用户环境下可使用下面的命令显示内存统计信息,包括内存用途、内存类型、内存状态     !address  -summary

Windbg 查内存占用

Windbg 查内存占用
  • !vprot  [地址]
  • !vadump  [-v]
  命令!vprot显示指定内存块的信息,侧重于内存保护信息;命令!vadump显示整个内存空间信息,dump者倾泻也,开启-v选项将显示详细(Verbose)信息。
  上面讲过,用户环境下使用“!address  –summary”可显示用户空间的内存统计信息;现在再看两个内核命令,在内核环境下显示内存的统计信息:

  • !memusage
  此命令从物理内存角度显示内存统计信息。无数个页表信息将被打印出来,可以说是“最内存”的信息。此命令会查看所有的页帧,所以运行时会非常地耗时。
  • !vm
  此命令从虚拟内存的角度显示内存统计信息,不仅能从全局角度显示虚拟内存的使用情况,还能以进程为单位显示内存使用情况。



-----具体查询内存占用的方法 如下

!EEHeap [-gc] [-loader]   查找堆信息

Windbg 查内存占用

Windbg 查内存占用

!DumpHeap 将遍历 GC 堆对对象进行分析。通过指定不同的选项,可以查看特定的类型、数组和锁。
                  如果不加任何选项,该命令的输出首先为堆中对象的列表,然后是包含已发现类型的列表、大小和数量的报表。
其中 “Free” 对象代表的是垃圾回收器可以使用的区域。如果此区域的大小超过30%则可能意味着出现了堆碎片。
这通常是由于某些对象被持有了较长时间,并且结合了大量高频率的内存分配。
!DumpHeap 会针对此情况提供一个关于堆碎片化的警告
-stat              限定输出为类型统计分析的汇总
-min <size>    忽略尺寸小于给定的 bytes 值的对象
-max <size>   忽略尺寸大于给定的 bytes 值的对象
!dumpheap -min 850000 -stat   查找具体占用内存大的对象 -stat (是否统计输出)

Windbg 查内存占用

Windbg 查内存占用

Windbg 查内存占用

Windbg 查内存占用
有两个地址  查找该地址的引用   !gcroot 000000052f342dc8
!do address 显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size

查找具体的位置 保存Model 到具体的地方 反编译查看原因


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

    发表于 2024-2-21 16:55:45
    感谢分享,我会认真学习的!

      发表于 2024-3-29 08:31:28
      谢谢分享 钻研中

        发表于 2024-4-8 15:50:10
        C:\Users\Administrator\AppData\Local\Temp
        zwt6781 发表于 2024-4-10 10:19 详情  回复
        谢谢分享 钻研中

          发表于 2024-4-10 10:19:34
          maskbank 发表于 2024-4-8 15:50
          C:%users\Administrator\AppData\Local\Temp


          谢谢分享 钻研中

            发表于 2024-4-10 10:20:00

            谢谢分享 钻研中

            小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

            GMT+8, 2024-4-28 02:08 , Processed in 0.112505 second(s), 65 queries .

            Powered by Discuz! X3.4

            Copyright © 2001-2021, Tencent Cloud.

            快速回复 返回顶部 返回列表