`

[微软工具][内存溢出] LeakDiag & LDGrapher & LeakDiagAutoLog - 适用于 release后期压力测试

 
阅读更多
参考资料
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和LDGrapher内存检测工具下载

    LeakDiag 和 LDGrapher 是一套专业的内存泄漏检测工具,它们为开发者提供了强大的诊断能力,帮助找出并解决程序中的内存管理问题。 LeakDiag 是一个命令行工具,它通过分析程序运行时的内存分配和释放情况来查找...

    Windows内存泄漏排查工具

    LeakDiag是由微软开发的一款轻量级内存泄漏检测工具,主要用于C++应用程序。它的主要功能是帮助开发者检测和定位内存泄漏的位置,从而快速修复问题。LeakDiag的工作原理是监控进程的内存分配和释放操作,当程序结束...

    LeakDiag和LDGrapher

    总的来说,LeakDiag和LDGrapher是Windows平台上强大的内存泄漏检测工具,它们能够帮助开发者精准定位和修复内存泄漏问题,提高软件质量和稳定性。通过熟练运用这两款工具,可以提升开发团队的效率,减少因内存问题...

    内存泄漏检测工具leakdiag和配套图形化查看工具LDGrapher

    LeakDiag不仅提供命令行界面,方便开发者在编译和测试阶段集成到自动化流程中,还配套了图形化查看工具LDGrapher。LDGrapher是一款用户友好的界面工具,它能够以图形化的形式展示内存泄漏的情况,包括泄漏的大小、...

    leakdiag+LDGrapher

    "leakdiag+LDGrapher" 不仅适用于大型项目,对于小型和中型项目同样有价值,因为即使是少量的内存泄露也可能随着时间推移而累积,成为性能瓶颈。通过定期使用这样的工具,开发者可以建立良好的内存管理习惯,提升...

    LDGrapher LeakDiag内存检测工具.rar

    软件介绍: ...两款不同的内存泄漏检测工具leakdiag和配套图形化查看工具LDGrapher,安装后即用。通过检测内存泄露,发现问题所在,省时又省力。内存检测工具集合:LDGrapher_setup.msileakdiag125.msi

    内存检测 leakdiag125

    "leakdiag125"是一个专门用于检测内存泄露状况的工具,其核心功能是帮助用户识别程序运行过程中未正确释放的内存块。 内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间。这通常是由于程序员在编写代码...

    内存泄漏检测工具leakdiag与LDParser

    leakdiag是一款高效且专业的内存泄漏检测工具,适用于C++和.NET应用程序。它通过动态地插入内存泄漏检测代码到程序中,来监控程序运行时的内存分配和释放情况。leakdiag能够详细报告哪些对象在程序结束时仍然占用...

    LeakDiag内存泄露检测工具

    **LeakDiag内存泄露检测工具** 在软件开发过程中,内存管理是至关重要的一个环节,尤其是在C++等不提供自动垃圾回收的语言中。内存泄露是一个常见的问题,它会导致程序运行效率降低,甚至最终崩溃。为了解决这个...

    内存泄漏查看工具(LeakDiag)

    2. **泄漏堆栈跟踪**:对于每个泄漏内存块,LeakDiag会显示分配该内存时的堆栈跟踪,这有助于追踪到导致泄漏的具体代码行。 3. **泄漏对象详细信息**:包括内存块的大小、类型和其他元数据,这些信息可以帮助理解...

    leakdiag 内存泄露检查工具

    "leakdiag"内存泄露检查工具是一款强大的诊断软件,它的主要功能是监控程序运行时的内存分配和释放情况,记录并分析一段时间内的内存使用趋势。通过运行leakdiag,开发者可以获取到关于内存泄漏的详尽报告,包括泄漏...

    LeakDiag安装包以及测试程序

    LeakDiag是一款专为检测和诊断C++程序内存泄漏问题而设计的工具,它能帮助开发者有效地找出并解决这些问题,从而提高软件的稳定性和性能。 LeakDiag的安装包包含了完整的诊断工具和测试程序,确保了用户能够顺利地...

    内存泄漏调试工具LeakDiag

    LeakDiag是一款专门针对Windows平台的内存泄漏检测工具,它可以帮助开发者定位并解决应用程序中的内存泄漏问题。LeakDiag的工作原理主要是通过监控进程的内存分配和释放操作,记录那些分配后未被释放的内存块,从而...

    LeakDiag(内存泄漏检测工具)V1.25免费安装版

    软件介绍 LeakDiag是微软一款检测内存泄漏的工具,可以用来精确地找到内存泄露一直到代码行。它使用微软的Detours 技术,拦截指定内存分配的调用并跟踪各种调用栈,并报告已分配但尚未释放的内存,这一信息允许让...

    leakdiag内存分析工具

    leakdiag内存分析工具

Global site tag (gtag.js) - Google Analytics