Подтвердить что ты не робот

Инструменты для идентификации богов в приложениях VB6

Какие инструменты доступны для атрибуции потребления памяти в приложении VB6 для него несколькими компонентами? Я могу получить память, потребляемую всем приложением, путем просмотра различных счетчиков (Private Bytes, Working Set и т.д.), Например, в Process Explorer. Я хочу идти глубже, чем это, и понимать, сколько памяти потребляется различными компонентами или объектами, созданными во время выполнения. Например, выясните, сколько памяти потребляется большой коллекцией, которая кэширует данные во время выполнения и как она изменяется в зависимости от количества элементов в коллекции.

4b9b3361

Ответ 1

Я не уверен, что какие-либо общедоступные (бесплатные) инструменты будут профилировать код VB6 до уровня модуля. Для C/С++ и .NET есть несколько профилировщиков памяти, но не так много на VB6, которые я видел. Похоже, что все старые поставщики (IBM Purify, Compuware Devpartner/Boundschecker) в этой области либо были выкуплены, либо переведены только в поддержку .NET.

Вы можете попробовать GlowCode. Он содержит поддержку С++, но также подчеркивает собственные изображения x86 для Win32.

Microsoft публикует DebugDiag, который поддерживает обнаружение утечки памяти для .NET или Win32, хотя я никогда не использовал его с VB, Он может не показывать выдающихся распределений на уровне модуля, но я бы сказал, что он по крайней мере будет атрибут того, какие библиотеки /dlls выделили большую часть памяти.

Ответ 2

Моим любимым инструментом должен быть DevPartner, хотя по 1500 фунтов стерлингов это не дешево. Это чертовски намного больше, чем проверка утечки памяти, хотя, если это все, что вам нужно, вы можете быть муравьями с ковровым покрытием.

Если вы хотите проверить, правильно ли освобождает ваше приложение, используйте эту функцию, которую я написал, чтобы выгрузить память в определенном месте. Сначала я должен кэшировать адреса каждой из ваших переменных, а затем при выключении вы могли бы вызвать DumpVariableMemory, передавая ссылки на эти местоположения, чтобы узнать, были ли они освобождены.

Если у вас его еще нет, вам также нужно добавить объявление fopr CopyMemory:)

    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

Ответ 3

"Валидатор памяти" может сообщить вам, где выделена (и просочилась) память в программах VB6 (и С++, C, Delphi, Fortran 95...).

Ответ 4

Там еще один инструмент на сайте MS, называемый processmonitor.exe. Он сообщает о каждом запросе, и вы можете использовать его возможности фильтрации для отслеживания только запросов процесса вашего приложения.