2009-04-13 20 views
12

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

2

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.

1

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.

+0

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. –

5

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 
2

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 ...).

Các vấn đề liên quan