Những công cụ nào có sẵn để phân bổ các bộ nhớ trong ứng dụng VB6 cho nhiều thành phần của nó? Tôi có thể nhận bộ nhớ được tiêu thụ bởi toàn bộ ứng dụng bằng cách xem các bộ đếm khác nhau (Private Bytes, Working Set, vv), ví dụ, trong Process Explorer. Tôi muốn đi sâu hơn mức độ đó và hiểu bao nhiêu bộ nhớ được tiêu thụ bởi các thành phần khác nhau hoặc các đối tượng được tạo ra trong thời gian chạy. Ví dụ, tìm ra số lượng bộ nhớ được tiêu thụ bởi bộ sưu tập lớn đó là bộ nhớ đệm dữ liệu tại thời gian chạy và làm thế nào nó thay đổi dựa trên số lượng các phần tử trong bộ sưu tập.Công cụ để xác định các bộ nhớ trong các ứng dụng VB6
Trả lời
Tôi không chắc chắn bất kỳ công cụ nào (miễn phí) công khai sẽ lược tả mã VB6 xuống cấp mô-đun. Có một số trình biên dịch bộ nhớ có sẵn cho C/C++ và .NET, nhưng không nhiều trên VB6 mà tôi đã thấy. Có vẻ như tất cả các nhà cung cấp cũ (IBM Purify, Compuware Devpartner/Boundschecker) trong lĩnh vực này đã được mua hoặc chỉ chuyển sang hỗ trợ .NET.
Bạn có thể thử GlowCode. Nó cho biết hỗ trợ C++, nhưng cũng nhấn mạnh Win32 hình ảnh x86 gốc.
Microsoft xuất bản DebugDiag, có hỗ trợ phát hiện rò rỉ bộ nhớ cho .NET hoặc Win32, mặc dù tôi chưa bao giờ sử dụng nó với VB. Nó có thể không hiển thị phân bổ xuất sắc cho cấp mô-đun, nhưng tôi đặt cược nó sẽ ít nhất là thuộc tính mà thư viện/dll đã phân bổ bộ nhớ nhất.
Có một công cụ khác trên trang web MS có tên là processmonitor.exe. Nó báo cáo mọi cuộc gọi yêu cầu và bạn có thể sử dụng khả năng lọc của nó để giám sát chỉ các yêu cầu quy trình của ứng dụng của bạn.
Công cụ yêu thích của tôi phải là DevPartner mặc dù ở mức 1.500 bảng một pop nó không phải là rẻ. Mặc dù vậy, nó còn tệ hơn nhiều so với kiểm tra rò rỉ bộ nhớ, nhưng nếu đó là tất cả những gì bạn cần, bạn có thể là những con kiến ném bom.
Nếu bạn muốn xem liệu ứng dụng của mình có đang phát hành tài nguyên chính xác hay không, hãy sử dụng chức năng này tôi đã viết để kết xuất bộ nhớ tại một vị trí nhất định. Lần đầu tiên tôi sẽ lưu địa chỉ của mỗi biến của bạn, sau đó tắt máy, bạn có thể gọi DumpVariableMemory truyền tham chiếu tới các vị trí đó để xem chúng có bị deallocated hay không.
Nếu bạn không có số này, bạn sẽ cần phải thêm một khai báo fopr CopyMemory quá :)
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 có thể cho bạn biết nơi bộ nhớ được phân bổ (và bị rò rỉ) trong các chương trình VB6 (và C++, C, Delphi, Fortran 95 ...).
- 1. Xác định các vấn đề về bộ nhớ trong một ứng dụng ASP.NET
- 2. Công cụ để xác định các bộ chọn CSS lặp lại trên hai biểu định kiểu
- 3. Linux: Xác định các trang trong bộ nhớ
- 4. Công cụ để chẩn đoán rò rỉ bộ nhớ trong .NET (Ứng dụng ASP.NET)
- 5. Làm thế nào để triển khai các ứng dụng VB6?
- 6. Cách xác định mức sử dụng bộ nhớ trong ứng dụng .NET của tôi
- 7. Xác định mức sử dụng bộ nhớ của các phần tử DOM được lưu trong bộ nhớ cache trong JavaScript?
- 8. Phân tích động các ứng dụng web PHP để xác định độ lệch dòng công việc
- 9. Hết bộ nhớ nhưng không thấy phân bổ đối tượng quá mức trong các Công cụ
- 10. Bộ công cụ tốt để phát triển các ứng dụng Blackberry là gì?
- 11. Công cụ để kiểm tra phân mảnh bộ nhớ
- 12. Tìm đường rò rỉ bộ nhớ trong Công cụ
- 13. Truy cập chính xác các giới hạn VB6
- 14. Quản lý bộ nhớ cho các ứng dụng chuyên sâu bộ nhớ cố ý
- 15. Công cụ UML cho các ứng dụng Qt
- 16. Trong ứng dụng OpenCV, làm cách nào để xác định nguồn rò rỉ bộ nhớ và sửa lỗi?
- 17. C# Bộ nhớ bị rò rỉ, theo dõi techinques và các công cụ
- 18. công cụ để lập hồ sơ ứng dụng GWT
- 19. Chạy các ứng dụng VB6 mà không cần cài đặt VB6
- 20. Lưu trữ chuỗi an toàn trong bộ nhớ từ trong các ứng dụng node.js
- 21. Công cụ bảng không xác định 'InnoDB'
- 22. Công cụ phân tích bộ nhớ/hiệu suất cho Android
- 23. Enums để xác định các bộ quyền trong C#
- 24. Xác định lượng bộ nhớ mà một lớp sử dụng?
- 25. Công cụ để xem các đối tượng trong permgen
- 26. Kiểm tra rò rỉ bộ nhớ trong các ứng dụng .NET
- 27. Xác định mức sử dụng bộ nhớ của các đối tượng?
- 28. Sử dụng công cụ 'Phân tích bộ nhớ' trong Qt Creator
- 29. Công cụ phân bổ các công cụ của Xcode bỏ lỡ một chút
- 30. Cảnh báo và sự cố bộ nhớ iPhone - nhưng Công cụ hiển thị mức sử dụng bộ nhớ thấp
Công cụ này không thể đi sâu hơn Process Monitor vì nó không biết về việc sử dụng bộ nhớ VB6. –