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

WinDbg

帖子发起人: mybios   发起时间: 2008-12-23 10:25 上午   回复: 5

Print Search
帖子排序:    
   2008-12-23, 10:25 上午
mybios 离线,最后访问时间: 2009/5/26 20:06:05 mybios

发帖数前100位
男
注册: 2008-12-18
发 贴: 13
Big Smile [:D] 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote
1、在gflags里给我指定的Image File开启“Create user mode stack trace database”和“Stack Backtrace 100M”。
2、在WinDBG里Open Executable打开这个exe
3、在Debug->Event Filter里把Exit Process设置成Handled,那么程序退出前就会断下来。
4、go,然后在程序里正常退出,这时会断下来(Exit Process异常)
5、输入!heap -k显示stack backtrace

但是,问题出来了,这是的!heap -k显示的结果是如下结果,不是我预期的内存泄漏信息:

0:000> !heap -k
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll -
*************************************************************************
*** ***
*** ***
*** Your debugger is not using the correct symbols ***
*** ***
*** In order for this command to work properly, your symbol path ***
*** must point to .pdb files that have full type information. ***
*** ***
*** Certain .pdb files (such as the public OS symbols) do not ***
*** contain the required information. Contact the group that ***
*** provided you with these symbols if you need this command to ***
*** work. ***
*** ***
*** Type referenced: ntdll!_HEAP_ENTRY ***
*** ***
*************************************************************************
Invalid type information


但是,我使用的都是本地编译的代码,都有pdb的,他缺说我没pdb,奇怪的说。
谁能告诉我如何弄?

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

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote
!heap这个扩展命令需要系统DLL(NTDLL和KERNEL32.DLL)的符号,上面的提示是说缺少ntdll!_HEAP_ENTRY(描述堆块的基本数据结构,见《软件调试》P658)这个结构的符号。
解决的方法是连接符号服务器(P935),让WinDBG自动下载系统文件的符号,也就是在连着互联网的情况下执行下面的两条命令:
.symfix c:\symbols (设置符号服务器,并把c:\symbols作为下游符号库)
.reload (重新加载符号)


IP 地址: 已记录   报告
   2008-12-23, 15:13 下午
mybios 离线,最后访问时间: 2009/5/26 20:06:05 mybios

发帖数前100位
男
注册: 2008-12-18
发 贴: 13
Re: 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote
谢谢老大回复。
现在可以了。
但是显示出来的是这些信息,不是我预期的调用函数列表:
0:000> !heap -k -a
Index Address Name Debugging options enabled
1: 00140000
Segment at 00140000 to 00240000 (0001d000 bytes committed)
Segment at 0b730000 to 0b830000 (00002000 bytes committed)
Segment at 10260000 to 10460000 (00002000 bytes committed)
Segment at 122a0000 to 126a0000 (00001000 bytes committed)
Segment at 16630000 to 16e30000 (00002000 bytes committed)
Segment at 1ae30000 to 1be30000 (00001000 bytes committed)
Segment at 1d710000 to 1f710000 (00001000 bytes committed)
2: 00240000
Segment at 00240000 to 00250000 (00006000 bytes committed)
3: 00250000
Segment at 00250000 to 00260000 (00003000 bytes committed)
4: 07860000
Segment at 07860000 to 07870000 (00007000 bytes committed)
Segment at 08060000 to 08160000 (0000d000 bytes committed)
Segment at 08220000 to 08420000 (0001a000 bytes committed)
Segment at 08420000 to 08820000 (00009000 bytes committed)
Segment at 08820000 to 09020000 (00099000 bytes committed)
Segment at 0a730000 to 0b730000 (000a5000 bytes committed)
Segment at 0c740000 to 0e740000 (0002c000 bytes committed)
Segment at 16e30000 to 1ae30000 (000a8000 bytes committed)
Segment at 223c0000 to 2a3c0000 (0000c000 bytes committed)
5: 07a60000
Segment at 07a60000 to 07a70000 (0000d000 bytes committed)
Segment at 09020000 to 09120000 (00046000 bytes committed)
6: 07d90000
Segment at 07d90000 to 07da0000 (00010000 bytes committed)
Segment at 09cc0000 to 09dc0000 (00013000 bytes committed)
Segment at 0f670000 to 0f870000 (00001000 bytes committed)
Segment at 0fb20000 to 0ff20000 (00002000 bytes committed)
Segment at 109c0000 to 111c0000 (00001000 bytes committed)
Segment at 148c0000 to 158c0000 (00001000 bytes committed)
7: 07da0000
Segment at 07da0000 to 07ea0000 (00003000 bytes committed)
Segment at 0f3f0000 to 0f4f0000 (00100000 bytes committed)
Segment at 0f870000 to 0fa70000 (00001000 bytes committed)
Segment at 10470000 to 10870000 (00400000 bytes committed)
Segment at 12a60000 to 13260000 (007ec000 bytes committed)
Segment at 137e0000 to 147e0000 (001a4000 bytes committed)
8: 08020000
Segment at 08020000 to 08060000 (00003000 bytes committed)
9: 09dd0000
Segment at 09dd0000 to 09ed0000 (00100000 bytes committed)

是不是要用其他什么命令?
我先摸索摸索。
再次感谢好书《软件调试》
IP 地址: 已记录   报告
   2008-12-24, 09:04 上午
mybios 离线,最后访问时间: 2009/5/26 20:06:05 mybios

发帖数前100位
男
注册: 2008-12-18
发 贴: 13
Re: 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote
最后还是使用umdh就可以显示泄漏内存的调用栈了了。
IP 地址: 已记录   报告
   2008-12-25, 19:14 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote
如果要想直接在WinDBG看符号化的栈调用,那么可以先找到UST数据的地址,然后使用dds命令。当然这不如UMDH那么自动化。

IP 地址: 已记录   报告
   2008-12-25, 22:28 下午
mybios 离线,最后访问时间: 2009/5/26 20:06:05 mybios

发帖数前100位
男
注册: 2008-12-18
发 贴: 13
Re: 关于用UST+WinDBG来检测内存泄露的问题
Reply Quote

嗯。这个我也学会了。改天写个插件用来一次性把所有UST堆栈在WinDBG里打出来才行。这个插件应该蛮容易写。

我还想写个有点类似于VS2005看STL模板容器的WinDBG插件,这种模板符号的翻译我害怕那个PDB不支持。不知道是否可行?找时间试试才行


IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » Re: 关于用UST+WinDBG来检测内存泄露的问题

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