zoukankan      html  css  js  c++  java
  • 强大的windbg定位内存泄露,两句命令搞定!

    1.简单配置
    在windbg程序目录下有个gflags.exe,运行后设置:

    运行CMD.EXE,输入"D:Debugging Tools for Windows (x86)gflags.exe" /i test.exe +ust,如果设置成功则显示:

    如果设置失败,说明注册表被禁用了,可以尝试解除所有对注册表的禁用。这个注册表位置为:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options,命令“gflags.exe /i test.exe +ust”实际上就是在该路径下创建一个子键“test.exe”并创建一个名为GlobalFlag内容为0x00001000的REG_DWORD值。
    参考:http://support.citrix.com/article/CTX106970

    我起初的时候也设置失败了,后来发现是360的一个服务禁止了对上述注册表的操作,卸载之后就行了。

    2.关于符号
    如果符号不全或者不正确,也不能使用该方法侦测内存泄露的位置。如果真机系统符号不全(如xp sp3),可以在虚拟机中侦测。

    3.具体实例
    例如内存泄露:
    Detected memory leaks!
    Dumping objects ->
    e:vs工程 ests estsdlg.cpp(101) : {118} normal block at 0x003BBAD8, 100 bytes long.
    Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
    Object dump complete.

    !heap -x 0x003BBAD8

    Entry     User      Heap      Segment       Size  PrevSize  Unused    Flags
    -----------------------------------------------------------------------------
    003bbab0  003bbab8  003b0000  003b0640        a0      17f0        18  busy extra fill 

    !heap -p -a 003bbab0  

    address 003bbab0 found in
    _HEAP @ 3b0000
    HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    003bbab0 0014 0000  [07]   003bbab8    00088 - (busy)
    Trace: 0357
    7c98eed2 ntdll!RtlDebugAllocateHeap+0x000000e1
    7c96b394 ntdll!RtlAllocateHeapSlowly+0x00000044
    7c938f21 ntdll!RtlAllocateHeap+0x00000e64
    1024db9c MSVCR80D!malloc_base+0x000000ec
    1020faa5 MSVCR80D!malloc_dbg+0x000002d5
    1020f839 MSVCR80D!malloc_dbg+0x00000069
    1020f7ef MSVCR80D!malloc_dbg+0x0000001f
    78332934 MFC80UD+0x00052934
    783329b8 MFC80UD+0x000529b8
    78332396 MFC80UD+0x00052396
    4129ae tests!CtestsDlg::OnInitDialog+0x0000013e
    7839bfae MFC80UD+0x000bbfae
    77d18734 USER32!InternalCallWinProc+0x00000028
    77d2413c USER32!UserCallDlgProcCheckWow+0x000000f0
    77d23b30 USER32!DefDlgProcWorker+0x000000a8
    77d23d5c USER32!DefDlgProcW+0x00000022
    77d18734 USER32!InternalCallWinProc+0x00000028
    77d18816 USER32!UserCallWinProcCheckWow+0x00000150
    77d2a013 USER32!CallWindowProcAorW+0x00000098
    77d2a039 USER32!CallWindowProcW+0x0000001b
    7835e302 MFC80UD+0x0007e302
    7835cb1b MFC80UD+0x0007cb1b
    7839d393 MFC80UD+0x000bd393
    7835fbf7 MFC80UD+0x0007fbf7
    7835f3b0 MFC80UD+0x0007f3b0
    7835c9be MFC80UD+0x0007c9be
    7835ceb4 MFC80UD+0x0007ceb4
    78358979 MFC80UD+0x00078979
    77d18734 USER32!InternalCallWinProc+0x00000028
    77d18816 USER32!UserCallWinProcCheckWow+0x00000150
    77d2927b USER32!SendMessageWorker+0x000004a5
    77d2651a USER32!InternalCreateDialog+0x000009df

    其中4129ae 地址就是分配内存的地方,从而导致的内存泄露。


    http://support.microsoft.com/kb/268343/zh-cn

  • 相关阅读:
    sqlserver 把两个sql查询语句查询出来的两张表合并成一张表
    highcharts series几种写法
    Collection、 List 、Set接口 LinkedList 、HashSet类, Collections 集合工具类
    java.io.File
    Object、Objects
    java.lang.StringBuilder
    String
    java学习日记(17-18)
    java学习日记(14-16)
    java学习日记(8-13)
  • 原文地址:https://www.cnblogs.com/kissfu/p/3465535.html
Copyright © 2011-2022 走看看