Какие инструменты доступны для атрибуции потребления памяти в приложении VB6 для него несколькими компонентами? Я могу получить память, потребляемую всем приложением, путем просмотра различных счетчиков (Private Bytes, Working Set и т.д.), Например, в Process Explorer. Я хочу идти глубже, чем это, и понимать, сколько памяти потребляется различными компонентами или объектами, созданными во время выполнения. Например, выясните, сколько памяти потребляется большой коллекцией, которая кэширует данные во время выполнения и как она изменяется в зависимости от количества элементов в коллекции.
Инструменты для идентификации богов в приложениях VB6
Ответ 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. Он сообщает о каждом запросе, и вы можете использовать его возможности фильтрации для отслеживания только запросов процесса вашего приложения.