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
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.
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.
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
Memory Validator kann Ihnen sagen, wo Speicher (und sickerte) in VB6 Programme zugeordnet ist (und C++, C, Delphi, Fortran 95 ...).
- 1. Kostenlose Tools zum Identifizieren von Speicherlecks in .Net-Anwendung
- 2. Identifizieren Sie JavaScript-Schließungen mit Entwickler-Tools
- 3. Tools zum Programmieren von Tutorials?
- 4. Verwenden von Zeichenfolgen zum Identifizieren von Etikettenobjekten
- 5. Tools zum Erstellen von AnimatedVectorDrawable
- 6. Tools zum Tauschen von Gleichungen in Code
- 7. Tools zum Abfragen von Auflistungen in Heapspeicherauszug
- 8. Tools zum Debugging von Speicherlecks in JavaScript
- 9. Tools zum Verwalten von Verzweigungen in SVN
- 10. Was sind gute Tools zum Identifizieren von potenziell dupliziertem Code für C# Express-Benutzer?
- 11. Algorithmus zum Identifizieren von "fuzzily-connected" Subgraphen
- 12. Tools zum Erkennen von doppeltem Code (Java)
- 13. Tools zum Vergleichen von zwei Websites Strukturen
- 14. Tools zum Überprüfen von .lib-Dateien?
- 15. Tools zum Finden von Solr-Performance-Problemen
- 16. Tools zum Hacken von Flex-Datenverbindungen
- 17. Tipps oder Tools zum Debuggen von Federanwendungen?
- 18. Tools zum Konvertieren von Svg zu TTF
- 19. Spring, Java: Streaming-Datei-Download zur Vermeidung von Speicherfehlern
- 20. Linux-Tools zum Überprüfen von Windows-DLLs
- 21. Tools zum Bearbeiten von PowerPoint-Dateien
- 22. Tools zum Generieren von Haskell-Funktionsabhängigkeitsdiagramm (Kontrollfluss)?
- 23. Tools zum Generieren von Einheitenabhängigkeiten für Delphi
- 24. Leistungsstarke Tools zum Erstellen von SQL-Abfragen
- 25. Tool zum Identifizieren von Java-Annotationen in verschiedenen Java-APIs
- 26. Tools zum Aufbau einer DSL in .NET
- 27. Tools zum Erstellen eines PrintDocuments?
- 28. Identifizieren von Anzeigen
- 29. Tools zum Konvertieren von HTML-Layouts in Silverlight 3.0
- 30. Tools zum Konvertieren von Code in PHP nach ASP.NET
Dieses Tool kann nicht tiefer gehen als Process Monitor, weil es nicht über die VB6-Speichernutzung informiert. –