2009-04-13 13 views
12

Jakie narzędzia są dostępne do przypisania zużycia pamięci w aplikacji VB6 do wielu składników? Mogę pobrać pamięć zużywaną przez całą aplikację, oglądając różne liczniki (prywatne bajty, zestaw roboczy itd.), Na przykład w Eksploratorze procesów. Chcę pójść o poziom wyżej i zrozumieć, ile pamięci jest zużywane przez różne komponenty lub obiekty tworzone w środowisku wykonawczym. Na przykład sprawdź, ile pamięci zużywa duża kolekcja, która buforuje dane w czasie wykonywania i jak zmienia się w zależności od liczby elementów w kolekcji.Narzędzia do identyfikacji świnek pamięci w aplikacjach VB6

Odpowiedz

2

Nie jestem pewien, czy jakiekolwiek publicznie dostępne (bezpłatne) narzędzia będą profilować kod VB6 do poziomu modułu. Istnieje kilka profilerów pamięci dostępnych dla C/C++ i .NET, ale nie wiele na VB6, które widziałem. Wygląda na to, że wszyscy dawni dostawcy (IBM Purify, Compuware Devpartner/Boundschecker) w tym obszarze zostali wykupieni lub przeniesieni tylko do wsparcia .NET.

Możesz spróbować GlowCode. Określa obsługę C++, ale także podkreśla natywne obrazy x86 systemu Win32.

Firma Microsoft publikuje DebugDiag, która obsługuje wykrywanie wycieków pamięci dla .NET lub Win32, choć nigdy nie korzystałem z VB. Może nie wyświetlać zaległych alokacji na poziomie modułu, ale założę się, że przynajmniej przydzieli to, które biblioteki/biblioteki dll przydzieliły najwięcej pamięci.

1

Na stronie MS znajduje się inne narzędzie o nazwie processmonitor.exe. Zgłasza każde wywołanie żądania i można użyć jego funkcji filtrowania do monitorowania tylko żądań procesów aplikacji.

+0

To narzędzie nie może przejść głębiej niż Monitor procesu, ponieważ nie wie o użyciu pamięci VB6. –

5

Moje ulubione narzędzie to DevPartner, ale za 1,500 funtów pop nie jest tanie. To ma dużo więcej wspólnego z wyjątkiem sprawdzania przecieków pamięci, ale jeśli to wszystko, czego potrzebujesz, możesz być mrówkami bombardującymi dywan.

Jeśli chcesz sprawdzić, czy Twoja aplikacja prawidłowo udostępnia zasoby, użyj tej funkcji, którą napisałem, aby zrzucić pamięć w określonej lokalizacji. Najpierw buforowałbym adresy każdej z twoich zmiennych, a następnie przy zamykaniu można nazwać DumpVariableMemory przekazując odniesienia do tych lokalizacji, aby sprawdzić, czy zostały one zwolnione.

Jeśli nie masz, musisz dodać declare fopr CopyMemory też :)

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 
2

Memory Validator może powiedzieć, gdzie pamięć jest alokowana (a wyciekły) w programach VB6 (i C++, C, Delphi, Fortran 95 ...).

Powiązane problemy