Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: jlflyfox   发起时间: 2009-06-25 15:54 下午   回复: 3

Print Search
帖子排序:    
   2009-06-25, 15:54 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
请问下如何从dump中找到某个heap是被哪个线程使用,注意,不允许用调试器attach上去
Reply Quote

来由是这样的,我怀疑目标进程有可能有内存泄露,但不允许调试,我就用vmmap来看进程地址空间,每隔2小时看一次,隔一阵,发现多了一些private空间,如下

6B040000   Private    21,600   44        28         28     22      Read/Write          
  6B040000 Private    4           4           4           4                 Read/Write          
  6B041000 Reserved   3,276                     

.................

................

然后我自己写了一个程序用ReadProcessMemory把    6B040000 的头4k字节抓出来,初步分析,有如下

6b040000  08 00 00 00 00 01 00 0c-ee  ff  ee  ff   00 00 00 00

6b040010  00 00 2a 00 00 a0 37 00-00 00 04 6b 18 15 00 00

开始怀疑ffeeffee是HEAP_SEGMENT,再看到后面字节002a0000就证实怀疑了,

002A0000   Heap (Private) 64        64         64        64             1       Read/Write   Heap ID:    4                                               

我用userdump抓了目标进程的内存映像,然后分析下面这个内存,果然如此

    Heap entries for Segment12 in Heap 002a0000
        6b040000: 00000 . 00040 [01] - busy (40)
        6b040040: 00040 . 00fc0 [10]

现在我非常想知道的是哪个线程在使用这个heap,我该如何查找?目标进程线程100多个,我不可能每个堆栈里面去搜索吧,还有我该搜索哪个dword,是6b040000?还是6b040040?还是002a0000?

另外,目标进程知道是用c++写的,调用了new来分配,没有直接调用Heap相关api,只是没有目标进程的代码,请指点哈


IP 地址: 已记录   报告
   2009-06-26, 15:14 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问下如何从dump中找到某个heap是被哪个线程使用,注意,不允许用调试器attach上去
Reply Quote
与栈绝对属于某个线程不同,堆(HEAP)通常是进程内全局的,也就是说,一个进程的所有线程都可能使用到某个堆。
你如果想查内存泄漏,那么可以启用堆的UST功能,然后用UMDH工具来比较和分析,参见《软件调试》23.7节,特别是P668~669页。
IP 地址: 已记录   报告
   2009-06-26, 21:09 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: 请问下如何从dump中找到某个heap是被哪个线程使用,注意,不允许用调试器attach上去
Reply Quote
先谢谢。
现在是我自己实验室模拟不出来,但现场却不能上参数,也不能重启,即无法使用UMDH工具来分析,我只好在现场用vmmap和userdump抓了进程内存回来分析。

我现在已经基本不用担心它是内存泄露,但我非常希望的是大致能看到或者能推测出是哪些线程在这个Heap 上操作,即c++概念上在这这个Heap里new/delete,或者说哪些"引用"了这个heap,这样我就基本有概念。


所以,我现在的困惑在于如何搜索或者发现这个heap segment的相关引用,我不知道该用哪个地址或者哪个数据进行search,如002a0000,还是6B040000,或者其他地址?
IP 地址: 已记录   报告
   2009-06-28, 10:50 上午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 请问下如何从dump中找到某个heap是被哪个线程使用,注意,不允许用调试器attach上去
Reply Quote
从上面的数据来看,6B040000是堆句柄,其实也就是这个堆的_HEAP结构的起始地址。搜索内存可能找到保存这个堆句柄的变量,但是想不出这有多大意义。如果是普通的C/C++程序,默认使用C/C++运行库来管理堆,应用程序自己的代码用不着直接管理维护堆句柄。
你先说怀疑内存泄漏,后来又不担心内存泄漏,到底是什么问题呢?建议先把问题/目标明确了。
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 请问下如何从dump中找到某个heap是被哪个线程使用,注意,不允许用调试器attach上去

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.