Re: 关于内存泄露输出dump到文件的问题

《软件调试》的示例程序

关于内存泄露输出dump到文件的问题


udknight 2009-12-10, 23:11 下午

现在项目组交给我一个程序,里面有少量的内存泄露。但由于代码量很大不是特别好跟踪。在郁闷的时候,翻了下高端调试,看到可以将泄漏检测出来并输出到文件。我在高端调试上面只看到介绍了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文件的。有没有什么好的解决办法。

Re: 关于内存泄露输出dump到文件的问题


Coding 2009-12-11, 16:15 下午
FlushFileBuffers一下试试看。
其实我还是偏爱UMDH来解决内存泄露问题。

Re: 关于内存泄露输出dump到文件的问题


格蠹老雷 2009-12-14, 12:36 下午
如果自己有源代码,那么使用CRT的泄露转储要比UMDH直接些,可以直接发现泄露的源代码位置。
楼主的代码打开文件,设置一下,然后就立刻把文件关闭了,这显然不行。
如果有《软件调试》,建议读一下23.14和23.15节。

Re: 关于内存泄露输出dump到文件的问题


Oak 2009-12-14, 17:37 下午
只有normal block 序号稳定时可以用张老师的方法
strcore.cpp(118) : {11232} normal block at 0x003FAF10, 45 bytes long.
如果序号不稳定,建议还是用UMDH把
或者 windbug中 !heap 也可以

Re: 关于内存泄露输出dump到文件的问题


udknight 2010-01-10, 13:18 下午
恩,问题已经解决。强制结束不会通知进程进行析构。用FlushFileBuffers可能需要定时刷新。

Powered by Community Server Powered by CnForums.Net