2009-04-13 11 views
12

Welche Tools sind verfügbar, um den Speicherverbrauch in VB6-Anwendungen den verschiedenen Komponenten zuzuordnen? Ich kann den Speicherverbrauch durch die gesamte Anwendung abrufen, indem ich verschiedene Zähler (Private Bytes, Working Set usw.) z. B. im Process Explorer beobachte. Ich möchte tiefer gehen und verstehen, wie viel Speicher von verschiedenen Komponenten oder Objekten verbraucht wird, die zur Laufzeit erstellt werden. Stellen Sie beispielsweise fest, wie viel Speicher von einer großen Sammlung verbraucht wird, die Daten zur Laufzeit zwischenspeichert und wie sie sich basierend auf der Anzahl der Elemente in der Sammlung ändert.Tools zum Identifizieren von Speicherfehlern in VB6-Anwendungen

Antwort

2

Ich bin mir nicht sicher, ob öffentlich verfügbare (kostenlose) Tools den VB6-Code bis auf Modulebene profilieren. Es gibt mehrere Speicherprofiler für C/C++ und .NET, aber nicht viel für VB6, die ich gesehen habe. Sieht so aus, als ob alle alten Anbieter (IBM Purify, Compuware Devpartner/Boundschecker) in diesem Bereich entweder gekauft wurden oder nur auf den .NET-Support umgestellt wurden.

Sie könnten versuchen GlowCode. Es gibt C++ - Unterstützung an, betont aber auch Win32-native x86-Images.

Microsoft veröffentlicht DebugDiag, die Unterstützung für Speicherleckerkennung für .NET oder Win32 unterstützt, obwohl ich es nie mit VB verwendet habe. Es werden möglicherweise keine ausstehenden Zuordnungen für die Modulebene angezeigt, aber ich wette, dass es zumindest angibt, welche Bibliotheken/DLLs den meisten Speicher zugewiesen haben.

1

Es gibt ein weiteres Tool auf der MS-Site namens processmonitor.exe. Es meldet jeden Request-Aufruf und Sie können seine Filterfunktion nutzen, um nur die Prozessanforderungen Ihrer Anwendung zu überwachen.

+0

Dieses Tool kann nicht tiefer gehen als Process Monitor, weil es nicht über die VB6-Speichernutzung informiert. –

5

Mein Lieblingswerkzeug muss DevPartner sein, obwohl es bei £ 1.500 pro Pop nicht billig ist. Es tut verdammt viel mehr als Memory-Leck-Überprüfung, aber wenn das alles ist, was Sie brauchen, könnten Sie Teppich Bomben Ameisen sein.

Wenn Sie sehen möchten, ob Ihre App Ressourcen richtig freigibt, verwenden Sie diese Funktion, die ich geschrieben habe, um den Speicher an einem bestimmten Speicherort auszugeben. Ich würde zuerst die Adressen jeder Ihrer Variablen zwischenspeichern, dann könnten Sie beim Herunterfahren die DumpVariableMemory aufrufen, die Verweise auf diese Speicherorte übergibt, um zu sehen, ob sie freigegeben wurden.

Wenn Sie nicht bereits haben, werden Sie eine declare fopr Copymemory auch hinzufügen müssen :)

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 kann Ihnen sagen, wo Speicher (und sickerte) in VB6 Programme zugeordnet ist (und C++, C, Delphi, Fortran 95 ...).

Verwandte Themen