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

《软件调试》的示例程序

帖子发起人: udknight   发起时间: 2009-12-10 23:11 下午   回复: 4

Print Search
帖子排序:    
   2009-12-10, 23:11 下午
udknight 离线,最后访问时间: 2010/2/16 16:20:30 udknight

发帖数前50位
注册: 2009-04-13
发 贴: 18
关于内存泄露输出dump到文件的问题
Reply Quote

现在项目组交给我一个程序,里面有少量的内存泄露。但由于代码量很大不是特别好跟踪。在郁闷的时候,翻了下高端调试,看到可以将泄漏检测出来并输出到文件。我在高端调试上面只看到介绍了API,并没有讲解例子。于是查了下msdn写了一下代码:

在OnInitDialog()函数写下  _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG);

void CMemoryLeakDlg::OnOK()
{
 // TODO: Add extra validation here


 Test1();
 Test2();
 Test3();
 Test4();
 HANDLE hLogFile = CreateFile("./memleak.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ,
 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//创建日志文件
 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);//将warn级别的内容都输出到文件
 _CrtSetReportFile(_CRT_WARN, hLogFile);//将日志文件设置为告警的输出文件
 CloseHandle(hLogFile);
 
}

BOOL CMemoryLeakDlg::Test1()
{
 char *p = new char;
 return TRUE;
}


BOOL CMemoryLeakDlg::Test2()
{
 char *p2 = new char;
 delete p2;
 return TRUE;
}

struct a
{
 int c;
 int b;
};

BOOL CMemoryLeakDlg::Test3()
{
 a* pp = new a;
 return TRUE;
}

BOOL CMemoryLeakDlg::DestroyWindow()
{
 // TODO: Add your specialized code here and/or call the base class

 return CDialog::DestroyWindow();
}

void CMemoryLeakDlg::Test4()
{
 int *c = new int;
}

程序每次退出的时候都会将泄漏文件名和行号记下并写入到memleak.log中。这里要有2个疑问:

1 我点击完ok按钮,程序响应ONOK函数的时候。为什么没有立刻将泄漏输出呢?

2 我强行结束掉进程,程序是不会写dump文件的。有没有什么好的解决办法。


IP 地址: 已记录   报告
   2009-12-11, 16:15 下午
Coding 离线,最后访问时间: 2010/2/20 12:12:52 Coding

发帖数前10位
注册: 2008-05-31
发 贴: 103
Re: 关于内存泄露输出dump到文件的问题
Reply Quote
FlushFileBuffers一下试试看。
其实我还是偏爱UMDH来解决内存泄露问题。
IP 地址: 已记录   报告
   2009-12-14, 12:36 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于内存泄露输出dump到文件的问题
Reply Quote
如果自己有源代码,那么使用CRT的泄露转储要比UMDH直接些,可以直接发现泄露的源代码位置。
楼主的代码打开文件,设置一下,然后就立刻把文件关闭了,这显然不行。
如果有《软件调试》,建议读一下23.14和23.15节。
IP 地址: 已记录   报告
   2009-12-14, 17:37 下午
lgq198660837 离线,最后访问时间: 2009/12/19 14:35:08 Oak

发帖数前100位
注册: 2009-10-19
发 贴: 14
Re: 关于内存泄露输出dump到文件的问题
Reply Quote
只有normal block 序号稳定时可以用张老师的方法
strcore.cpp(118) : {11232} normal block at 0x003FAF10, 45 bytes long.
如果序号不稳定,建议还是用UMDH把
或者 windbug中 !heap 也可以
IP 地址: 已记录   报告
   2010-01-10, 13:18 下午
udknight 离线,最后访问时间: 2010/2/16 16:20:30 udknight

发帖数前50位
注册: 2009-04-13
发 贴: 18
Re: 关于内存泄露输出dump到文件的问题
Reply Quote
恩,问题已经解决。强制结束不会通知进程进行析构。用FlushFileBuffers可能需要定时刷新。
IP 地址: 已记录   报告
高端调试 » 图书 » 《软件调试》的示例程序 » Re: 关于内存泄露输出dump到文件的问题

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