- 浏览: 369752 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
参考资料
http://download.csdn.net/download/BlueMap/2518291
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
http://www.codeproject.com/Articles/108529/LeakDiag-An-Effective-Memory-Leak-Analysis-Tool
写一个定时抓log的AP:LeakDiagAutoLog.exe
LeakDiag使用手记
1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。
2.程序运行后,打开LeakDiag,设置Symbol path
3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏
优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!
缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。
安装好,默认是在c:\leakdiag
然后写一个测试程序来测试
在LeakDiag中选择aaa.exe
然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop
会在c:\leakdiag\Logs下面生成一个log
关键的部分是
其中numallocs是分配的次数,size是每次分配的大小,frame则是leak的时候的call stack
这里的stack只显示了binary,是因为symbol没有配好
把对应的pdb文件路径加到[Tools]-[Option]-Symbol search path,就能得到
由test.cpp line 8引起的memory leak.
http://download.csdn.net/download/BlueMap/2518291
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
http://www.codeproject.com/Articles/108529/LeakDiag-An-Effective-Memory-Leak-Analysis-Tool
写一个定时抓log的AP:LeakDiagAutoLog.exe
BOOL CLeakDiagAutoLogDlg::DoAutoLogging() { CString strData; m_pMsgEdit->GetWindowText(strData); HWND m_pHwnd = ::FindWindow(NULL, _T("LeakDiag")); if (m_pHwnd != NULL) { HWND m_pHwnLogBtnCtrl = ::FindWindowEx(m_pHwnd, NULL, _T("Button"), _T("Log")); if (m_pHwnLogBtnCtrl != NULL) { long id = ::GetDlgCtrlID(m_pHwnLogBtnCtrl); ::PostMessage(m_pHwnd, WM_COMMAND, MAKELONG(id, BN_CLICKED), NULL); } else { strData += _T("m_pHwnLogBtnCtrl is NULL\r\n"); m_pMsgEdit->SetWindowText(strData); return FALSE; } } else { strData += _T("m_pHwnd is NULL!\r\n"); m_pMsgEdit->SetWindowText(strData); return FALSE; } return TRUE; // HWND m_pHwnStartControl = ::FindWindowEx(m_pHwnd, NULL, _T("Button"), _T("Start")); // ASSERT(m_pHwnStartControl != NULL); // long id = ::GetDlgCtrlID(m_pHwnStartControl); // ::PostMessage(m_pHwnd, WM_COMMAND, MAKELONG(id,BN_CLICKED), NULL); } void CLeakDiagAutoLogDlg::OnBnClickedRunBtn() { // TODO: Add your control notification handler code here UpdateData(TRUE); if (0 == m_dwTimeSpan) { m_dwTimeSpan =1; } CEdit* pEdit = static_cast<CEdit*>(GetDlgItem(IDC_RUN_BTN)); if (!m_bTimer) { SetTimer(1, UINT(m_dwTimeSpan*1000), NULL); m_bTimer = TRUE; pEdit->SetWindowText(_T("Stop")); } else { KillTimer(1); m_bTimer = FALSE; pEdit->SetWindowText(_T("Start")); } UpdateData(FALSE); } void CLeakDiagAutoLogDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default CTime cTime = CTime::GetCurrentTime(); CString strTime = cTime.Format("[%Y-%m-%d %H:%M:%S] ");//display YYYY:MM:DD HH:MM:SS switch (nIDEvent) { case 1: { if (DoAutoLogging()) { CString strData; CString strTemp; strTemp.Format("[RUN = %ld] DoAutoLogging", ++m_dwTotalRun); m_pMsgEdit->GetWindowText(strData); strData += strTime; strData += strTemp; strData += "\r\n"; m_pMsgEdit->SetWindowText(strData); } break; } case 2: default: { break; } } CDialog::OnTimer(nIDEvent); }
LeakDiag使用手记
1.在IDE工程选项里面配置Release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。
2.程序运行后,打开LeakDiag,设置Symbol path
3.定期Log下目标进程的内存分配情况,通过LDGraph打印分配增长情况,来发现内存泄漏
优点:同hookapi方法,非侵入式修改,无需做任何代码改动。跟踪全面。可视化分析堆栈一览无余!
缺点:对性能有影响,hook分配加锁,遍历堆栈。但是不会占用目标进程的自身内存。
安装好,默认是在c:\leakdiag
然后写一个测试程序来测试
#include <stdio.h> #include <windows.h> int main() { while(1) { char *c = new char[10]; printf("%s",c); Sleep(1000); } return 0; }
在LeakDiag中选择aaa.exe
然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop
会在c:\leakdiag\Logs下面生成一个log
关键的部分是
<LEAKS ver="1.25.28.2201"> <STACK numallocs="05" size="048" totalsize="0240"> <STACKSTATS> <SIZESTAT size="048" numallocs="05"/> <HEAPSTAT handle="340000" numallocs="05"/> </STACKSTATS> <FRAME num="0" dll="aaa.exe" function="" filename="" line="" addr="0x407a72" offset="0x00007A72" /> <FRAME num="1" dll="aaa.exe" function="" filename="" line="" addr="0x402ff2" offset="0x00002FF2" /> <FRAME num="2" dll="aaa.exe" function="" filename="" line="" addr="0x402df9" offset="0x00002DF9" /> <FRAME num="3" dll="aaa.exe" function="" filename="" line="" addr="0x402dd6" offset="0x00002DD6" /> <FRAME num="4" dll="aaa.exe" function="" filename="" line="" addr="0x40112f" offset="0x0000112F" /> <FRAME num="5" dll="aaa.exe" function="" filename="" line="" addr="0x401038" offset="0x00001038" /> <FRAME num="6" dll="aaa.exe" function="" filename="" line="" addr="0x401269" offset="0x00001269" /> <FRAME num="7" dll="KERNEL32.dll" function ="GetSortTablesFileInfo" offset="0xC" filename="" line="" addr="0x7C5989D5" /> <STACKID>00524008</STACKID> </STACK> </LEAKS>
其中numallocs是分配的次数,size是每次分配的大小,frame则是leak的时候的call stack
这里的stack只显示了binary,是因为symbol没有配好
把对应的pdb文件路径加到[Tools]-[Option]-Symbol search path,就能得到
<LEAKS ver="1.25.28.2201"> <STACK numallocs="06" size="048" totalsize="0288"> <STACKSTATS> <SIZESTAT size="048" numallocs="06"/> <HEAPSTAT handle="340000" numallocs="06"/> </STACKSTATS> <FRAME num="0" dll="aaa.exe" function ="_heap_alloc_base" offset="0xC2" filename="malloc.c" line="200" addr="0x407A72" /> <FRAME num="1" dll="aaa.exe" function ="_heap_alloc_dbg" offset="0x1A2" filename="dbgheap.c" line="378" addr="0x402FF2" /> <FRAME num="2" dll="aaa.exe" function ="_nh_malloc_dbg" offset="0x19" filename="dbgheap.c" line="248" addr="0x402DF9" /> <FRAME num="3" dll="aaa.exe" function ="_nh_malloc" offset="0x16" filename="dbgheap.c" line="197" addr="0x402DD6" /> <FRAME num="4" dll="aaa.exe" function ="operator new" offset="0xF" filename="new.cpp" line="24" addr="0x40112F" /> <FRAME num="5" dll="aaa.exe" function ="main" offset="0x28" filename="D:\Test\aaa\test.cpp" line="8" addr="0x401038" /> <FRAME num="6" dll="aaa.exe" function ="mainCRTStartup" offset="0xE9" filename="crt0.c" line="206" addr="0x401269" /> <STACKID>00524008</STACKID> </STACK> </LEAKS>
由test.cpp line 8引起的memory leak.
- LeakDiag内存泄漏检测工具leakdiag和配套图形化查看工具LDGrapher.zip (1.5 MB)
- 下载次数: 3
- How_To_Use_LeakDiag___LDGrapher.zip (655.8 KB)
- 下载次数: 1
- LeakDiagAutoLog.zip (847.6 KB)
- 下载次数: 1
- LeakDiagAutoLog_SRC.zip (915.5 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1325https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
[轉] android默认debug.keystore的密码
2017-12-12 11:14 1057http://blog.csdn.net/leehong200 ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java反编译工具 - Java Decompiler
2017-06-21 20:14 475http://jd.benow.ca/ JD-GUI is ... -
JAVA环境变量配置
2017-06-19 13:56 356参考Link http://www.cnblogs.com/x ... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
Windows7上使用VMWare搭建iPhone开发环境
2017-05-17 08:49 449Windows7上使用VMWare搭建iPhone开发环境 h ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
WinCE 内存检测
2016-09-30 16:30 645Wince内存泄露检测工具Application Verifi ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ...
相关推荐
LeakDiag 和 LDGrapher 是一套专业的内存泄漏检测工具,它们为开发者提供了强大的诊断能力,帮助找出并解决程序中的内存管理问题。 LeakDiag 是一个命令行工具,它通过分析程序运行时的内存分配和释放情况来查找...
LeakDiag是由微软开发的一款轻量级内存泄漏检测工具,主要用于C++应用程序。它的主要功能是帮助开发者检测和定位内存泄漏的位置,从而快速修复问题。LeakDiag的工作原理是监控进程的内存分配和释放操作,当程序结束...
总的来说,LeakDiag和LDGrapher是Windows平台上强大的内存泄漏检测工具,它们能够帮助开发者精准定位和修复内存泄漏问题,提高软件质量和稳定性。通过熟练运用这两款工具,可以提升开发团队的效率,减少因内存问题...
LeakDiag不仅提供命令行界面,方便开发者在编译和测试阶段集成到自动化流程中,还配套了图形化查看工具LDGrapher。LDGrapher是一款用户友好的界面工具,它能够以图形化的形式展示内存泄漏的情况,包括泄漏的大小、...
"leakdiag+LDGrapher" 不仅适用于大型项目,对于小型和中型项目同样有价值,因为即使是少量的内存泄露也可能随着时间推移而累积,成为性能瓶颈。通过定期使用这样的工具,开发者可以建立良好的内存管理习惯,提升...
软件介绍: ...两款不同的内存泄漏检测工具leakdiag和配套图形化查看工具LDGrapher,安装后即用。通过检测内存泄露,发现问题所在,省时又省力。内存检测工具集合:LDGrapher_setup.msileakdiag125.msi
"leakdiag125"是一个专门用于检测内存泄露状况的工具,其核心功能是帮助用户识别程序运行过程中未正确释放的内存块。 内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间。这通常是由于程序员在编写代码...
leakdiag是一款高效且专业的内存泄漏检测工具,适用于C++和.NET应用程序。它通过动态地插入内存泄漏检测代码到程序中,来监控程序运行时的内存分配和释放情况。leakdiag能够详细报告哪些对象在程序结束时仍然占用...
**LeakDiag内存泄露检测工具** 在软件开发过程中,内存管理是至关重要的一个环节,尤其是在C++等不提供自动垃圾回收的语言中。内存泄露是一个常见的问题,它会导致程序运行效率降低,甚至最终崩溃。为了解决这个...
2. **泄漏堆栈跟踪**:对于每个泄漏内存块,LeakDiag会显示分配该内存时的堆栈跟踪,这有助于追踪到导致泄漏的具体代码行。 3. **泄漏对象详细信息**:包括内存块的大小、类型和其他元数据,这些信息可以帮助理解...
"leakdiag"内存泄露检查工具是一款强大的诊断软件,它的主要功能是监控程序运行时的内存分配和释放情况,记录并分析一段时间内的内存使用趋势。通过运行leakdiag,开发者可以获取到关于内存泄漏的详尽报告,包括泄漏...
LeakDiag是一款专为检测和诊断C++程序内存泄漏问题而设计的工具,它能帮助开发者有效地找出并解决这些问题,从而提高软件的稳定性和性能。 LeakDiag的安装包包含了完整的诊断工具和测试程序,确保了用户能够顺利地...
LeakDiag是一款专门针对Windows平台的内存泄漏检测工具,它可以帮助开发者定位并解决应用程序中的内存泄漏问题。LeakDiag的工作原理主要是通过监控进程的内存分配和释放操作,记录那些分配后未被释放的内存块,从而...
软件介绍 LeakDiag是微软一款检测内存泄漏的工具,可以用来精确地找到内存泄露一直到代码行。它使用微软的Detours 技术,拦截指定内存分配的调用并跟踪各种调用栈,并报告已分配但尚未释放的内存,这一信息允许让...
leakdiag内存分析工具