Memory 用于识别VB6应用程序中内存占用的工具

Memory 用于识别VB6应用程序中内存占用的工具,memory,vb6,memory-management,Memory,Vb6,Memory Management,有哪些工具可用于将VB6应用程序中的内存消耗归因于其多个组件? 我可以通过观察各种计数器(专用字节、工作集等)来获取整个应用程序所消耗的内存,例如,在Process Explorer中。我想更深入地了解运行时创建的各种组件或对象消耗了多少内存。例如,计算在运行时缓存数据的大型集合消耗了多少内存,以及它如何根据集合中的元素数进行更改。在MS站点上还有一个名为的工具。它报告每个请求调用,您可以使用其过滤功能仅监视应用程序的进程请求。我不确定任何公开可用(免费)工具是否会将VB6代码分析到模块级别。有

有哪些工具可用于将VB6应用程序中的内存消耗归因于其多个组件?
我可以通过观察各种计数器(专用字节、工作集等)来获取整个应用程序所消耗的内存,例如,在Process Explorer中。我想更深入地了解运行时创建的各种组件或对象消耗了多少内存。例如,计算在运行时缓存数据的大型集合消耗了多少内存,以及它如何根据集合中的元素数进行更改。

在MS站点上还有一个名为的工具。它报告每个请求调用,您可以使用其过滤功能仅监视应用程序的进程请求。

我不确定任何公开可用(免费)工具是否会将VB6代码分析到模块级别。有几种可用于C/C++和.NET的内存分析器,但我在VB6上看到的不多。看起来这一领域的所有老供应商(IBM Purify、Compuware Devpartner/Boundschecker)要么已经被收购,要么只支持.NET

你可以试试。它支持C++,但也强调Win32本地X86图像。
微软发布了一款支持.NET或Win32内存泄漏检测的软件,尽管我从未在VB中使用过。它可能不会显示模块级别的未完成分配,但我敢打赌它至少会显示哪些库/DLL分配了最多内存。

我最喜欢的工具必须是DevPartner,尽管它的价格不便宜,但一次1500英镑。虽然它比内存泄漏检查做得多得多,但如果这就是你所需要的,你可能就是地毯炸弹蚂蚁

如果您想查看应用程序是否正确释放了资源,请使用我编写的这个函数将内存转储到给定位置。我将首先缓存每个变量的地址,然后在关机时调用DumpVariableMemory,传入对这些位置的引用,查看它们是否已被释放

如果还没有,还需要添加一个declare fopr CopyMemory:)

公共函数DumpVariableMemory(ByVal lngVariablePointer&_
ByVal lngBufferSizeInBytes&)作为字符串
''*对象名称:DumpVariableMemory
''*类型:函数
''*用途:返回变量或指针位置的内存转储
''*创建日期:21/08/2006-17:41:32
''*编码员:Richard Pashley-NUPUK00008148
''*建造机器:W-XPRP-77
''*封装:完整
''*参数:lngVariablePointer-长-指向要转储的数据的指针
''*lngBufferSizeInBytes-长-要输出的转储大小(字节)
''*返回:--String-内存转储输出为字符串
''*这将转储从指针地址开始的内存位置,并
''*结束于地址加上偏移量(lngBufferSizeInBytes)。
''*您可以使用LenB来确定
''*lngBufferSizeInBytes参数(如果需要)。
''*示例:DebugPrint DumpVariableMemory(VarPtr(lngMyLongValue)、LenB(lngMyLongValue)
''*修改人:[姓名]
''*日期:[日期]
''*原因:[NUPUKxxxxxxxxx]
“”声明本地人
Dim lngBufferIterator&''缓冲区迭代器
Dim lngBufferInnerIterator&''缓冲区循环内部迭代器
Dim ByxDumpArray()作为字节“”接收到输出缓冲区
Dim strDumpBuffer$“”格式的十六进制转储构造缓冲区
Dim lngValidatedBufferSize&''已验证传递的缓冲区大小
“”打开错误处理
错误转到DumpVariableMemory\u错误
“”调整输出缓冲区的大小
按XDumpArray(0到lngBufferSizeInBytes-1)重拨为字节
“”从提供的指针检索内存内容
调用CopyMemory(通过XDumpArray(0)_
ByVal lngVariablePointer_
lngBufferSizeInBytes)
“”格式转储头
strDumpBuffer=String(81,“=”)&vbCrLf&_
“指针地址=&h”&Hex$(lngVariablePointer)和_
“输出缓冲区大小=”&FormatBytes(lngBufferSizeInBytes)
“”添加标题分隔符
strDumpBuffer=strDumpBuffer&_
vbCrLf和字符串(81,Chr$(61))
“”验证缓冲区维度
如果lngBufferSizeInBytes Mod 16=0,则
“”已验证确定,请分配
lngValidatedBufferSize=lngBufferSizeInBytes
其他的
“”重构到基16
lngValidatedBufferSize=_
((lngBufferSizeInBytes\16)+1)*16
如果结束
“”遍历缓冲区内容
对于lngBufferIterator=0到(lngValidatedBufferSize-1)
“”确定第一行
如果(lngBufferIterator Mod 16)=0,则
“”格式转储输出行
strDumpBuffer=strDumpBuffer&vbCrLf&Right$(字符串(8,Chr$(48))_
&十六进制$(lngVariablePointer+lngBufferIterator),8)和空格(2)以及_
右$(字符串(4,Chr$(48))和十六进制$(lngBufferIterator),4)和空格(2)
如果结束
“”确定所需的转储缓冲区填充
如果lngBufferIterator    Public Function DumpVariableMemory(ByVal lngVariablePointer&, _
                                   ByVal lngBufferSizeInBytes&) As String
    '' * Object Name:   DumpVariableMemory
    '' * Type:          Function
    '' * Purpose:       Returns a memory dump of the variable or pointer location
    '' * Created:       21/08/2006 - 17:41:32
    '' * Coder:         Richard Pashley - NUPUK00008148
    '' * Build Machine: W-XPRP-77
    '' * Encapsulation: Full
    '' * Parameters:    lngVariablePointer      -   Long    -   Pointer to the data to dump
    '' *                lngBufferSizeInBytes    -   Long    -   Size of the dump to ouput in bytes
    '' * Returns:       -                       -   String  -   Memory dump output as a string
    '' *                This will dump the memory location starting at the pointer address and
    '' *                ending at the address plus the offset (lngBufferSizeInBytes).
    '' *                You can use LenB to determine the size of the variable for the
    '' *                lngBufferSizeInBytes parameter if required.
    '' *                Example: DebugPrint DumpVariableMemory(VarPtr(lngMyLongValue),LenB(lngMyLongValue)
    '' * Modified By:   [Name]
    '' * Date:          [Date]
    '' * Reason:        [NUPUKxxxxxxxxx]
    '' Declare locals
    Dim lngBufferIterator&                  '' Buffer iterator
    Dim lngBufferInnerIterator&             '' Buffer loop inner iterator
    Dim bytHexDumpArray() As Byte           '' Received output buffer
    Dim strDumpBuffer$                      '' Formatted hex dump construction buffer
    Dim lngValidatedBufferSize&             '' Validated passed buffer size
    '' Turn on error handling
    On Error GoTo DumpVariableMemory_Err
    '' Resize output buffer
    ReDim bytHexDumpArray(0 To lngBufferSizeInBytes - 1) As Byte
    '' Retrieve memory contents from supplied pointer
    Call CopyMemory(bytHexDumpArray(0), _
       ByVal lngVariablePointer, _
       lngBufferSizeInBytes)
    '' Format dump header
    strDumpBuffer = String(81, "=") & vbCrLf & _
       "Pointer Address = &h" & Hex$(lngVariablePointer) & _
       "   Ouput Buffer Size = " & FormatBytes(lngBufferSizeInBytes)
    '' Add header seperator
    strDumpBuffer = strDumpBuffer & _
       vbCrLf & String(81, Chr$(61))
    '' Validate buffer dimensions
    If lngBufferSizeInBytes Mod 16 = 0 Then
        '' Validated ok so assign
        lngValidatedBufferSize = lngBufferSizeInBytes
    Else
        '' Refactor to base 16
        lngValidatedBufferSize = _
           ((lngBufferSizeInBytes \ 16) + 1) * 16
    End If
    '' Iterate through buffer contents
    For lngBufferIterator = 0 To (lngValidatedBufferSize - 1)
        '' Determine if first row
        If (lngBufferIterator Mod 16) = 0 Then
            '' Format dump output row
            strDumpBuffer = strDumpBuffer & vbCrLf & Right$(String(8, Chr$(48)) _
               & Hex$(lngVariablePointer + lngBufferIterator), 8) & Space(2) & _
               Right$(String(4, Chr$(48)) & Hex$(lngBufferIterator), 4) & Space(2)
        End If
        '' Determine required dump buffer padding
        If lngBufferIterator < lngBufferSizeInBytes Then
            '' Pad dump buffer
            strDumpBuffer = strDumpBuffer & Right$(Chr$(48) & _
               Hex(bytHexDumpArray(lngBufferIterator)), 2)
        Else
            '' Pad dump buffer
            strDumpBuffer = strDumpBuffer & Space(2)
        End If
        '' Determine required dump buffer padding
        If (lngBufferIterator Mod 16) = 15 Then
            '' Pad dump buffer
            strDumpBuffer = strDumpBuffer & Space(2)
            '' Iterate through buffer row
            For lngBufferInnerIterator = (lngBufferIterator - 15) To lngBufferIterator
                '' Validate row width
                If lngBufferInnerIterator < lngBufferSizeInBytes Then
                    '' Validate buffer constraints
                    If bytHexDumpArray(lngBufferInnerIterator) >= 32 And _
                       bytHexDumpArray(lngBufferInnerIterator) <= 126 Then
                        '' Ouput data to dump buffer row
                        strDumpBuffer = strDumpBuffer & _
                           Chr$(bytHexDumpArray(lngBufferInnerIterator))
                    Else
                        '' Pad dump buffer
                        strDumpBuffer = strDumpBuffer & Chr$(45)
                    End If
                End If
            Next
            '' Determine required dump buffer padding
        ElseIf (lngBufferIterator Mod 8) = 7 Then
            '' Pad dump buffer
            strDumpBuffer = strDumpBuffer & Chr$(45)
        Else
            '' Pad dump buffer
            strDumpBuffer = strDumpBuffer & Space(1)
        End If
    Next
    '' Assign result to function output
    DumpVariableMemory = strDumpBuffer & _
       vbCrLf & String(81, Chr$(61)) & vbCrLf
Exit_Point:
    Exit Function
    '' Error Handling
DumpVariableMemory_Err:
    LogError "modNYFixLibrary.DumpVariableMemory", Err.Number, Err.Description
    DumpVariableMemory = String(81, Chr$(61)) & vbCrLf & _
       "DumpFailed!" & vbCrLf & String(81, Chr$(61))
    GoTo Exit_Point
    Resume
End Function