2009-10-12 12 views
20

Có thư viện nào trong xây dựng hoặc bên thứ ba cho phép bạn chỉ cần đổ tất cả các biến trong bộ nhớ trong thời gian chạy không? Điều tôi muốn là có thể xem các biến số & giá trị hiện tại tương tự như xem chúng bằng cách nhấn điểm ngắt và di chuột qua các biến, nhưng không thực sự phải tạm dừng thực thi chương trình (tức là chỉ cần chụp nhanh). Sẽ là tốt nếu nó có thể đổ chúng vào một tập tin mà sau đó có thể được mở sau đó trong một chương trình để có được một giao diện GUI đẹp để xem chúng, nhưng bãi chứa tệp văn bản đơn giản sẽ là đủ tốt.C# Làm thế nào để đổ tất cả các biến và giá trị hiện tại trong thời gian chạy

+0

Tôi nghĩ câu hỏi này rất chung chung và sẽ là một phần của "siêu trình gỡ rối" nếu câu trả lời tồn tại, vì vậy tôi đã mở một phần thưởng cho nó. Hãy tưởng tượng nếu danh sách biến có thể lọc được khi đang bay và cũng cho phép sử dụng bộ nhớ (người ta có thể mơ). –

+0

"trình gỡ lỗi tự"? –

+1

Không, tôi có nghĩa là 'siêu' vì nó sẽ vượt trội so với những gì chúng tôi thực sự hiện có với C#. –

Trả lời

7

Tôi không thể nghĩ ra cách dễ dàng để thực hiện việc này theo kiểu chung. Những gì có thể làm việc là lập trình tạo một tệp kết xuất của tiến trình đang chạy của bạn. Bạn có thể làm điều này với P/Gọi đến các thói quen dbghelp.dll hoặc sinh ra một quá trình cdb.exe để tạo tệp kết xuất. Khi bạn có tệp, bạn có thể mở tệp đó trong trình gỡ lỗi để phân tích sau bằng cách sử dụng SOS.dll with cdb.exe/windbg.exe hoặc thậm chí viết debugger script để tự động đổ dữ liệu bạn muốn (chủ yếu).

4

Tôi tin rằng một số loại khung đăng nhập sẽ giúp bạn làm điều đó ...

Check-out:

http://www.dotnetlogging.com/

Tại nơi làm việc của tôi, chúng tôi sử dụng log4net mà hoạt động khá tốt cho chúng ta.

Vậy làm cách nào bạn muốn loại bỏ tất cả các biến để phân tích sau này? Bạn có cân nhắc viết bài kiểm tra mã đầu tiên để bạn có thể giảm sự phụ thuộc của mình vào trình gỡ rối và có một bộ kiểm tra tự động kiểm tra các giá trị cho bạn không?

+0

Vâng tôi đã sử dụng đăng nhập tương tự như log4net. Tuy nhiên tôi muốn nhiều hơn như vậy một biến chung chung để tôi sẽ không phải viết mã cụ thể để đổ biến vào một logger cho mỗi chương trình. Nó cũng sẽ là tốt đẹp để có một người xem GUI của một ảnh chụp để cho các cấu trúc lớp phức tạp nó rất dễ đọc. – mike

+0

Tôi muốn biến các biến cho sự an tâm về cơ bản. Tôi tự tin vào chương trình nhưng chỉ muốn xác nhận mọi thứ sẽ ổn. Thật khó để viết các bài kiểm tra kỹ lưỡng về bản chất công việc tôi đang làm, và thậm chí sau đó bạn chỉ có thể viết các bài kiểm tra cho các tình huống mà bạn có thể nghĩ đến. Nó cũng sẽ có thể tạo thành một cách cấp thấp để xem trạng thái của chương trình ở bất kỳ thời điểm nào. – mike

1

Trước đây tôi đã sử dụng YourKit. Profiler để lập hồ sơ các ứng dụng .Net.

Trong khi tôi đã từng sử dụng nó để kết nối với các ứng dụng đang hoạt động, thì Snapshot documentation cho biết rằng chúng có một Profiler API có thể được sử dụng để lập trình các ảnh chụp nhanh để xem xét sau.

Mã khôn ngoan điều này có vẻ đơn giản như sau:

Controller c = new Controller(); 
String snapshotPath = c.CaptureSnapshot(); 

Tôi tin rằng sau đó bạn có thể tải các tập tin ảnh chụp vào GUI YourKit vào một ngày sau đó để xem xét lại.

Tôi sẽ không ngạc nhiên nếu một số trình phổ biến khác như JetBrains dotTrace Performance và RedGates ANTS Performance Profiler có API tương tự có lập trình nhưng tôi không thể nhanh chóng tìm thấy tài liệu rõ ràng trên trang web của họ (và tôi không muốn xem hội thảo trên web của họ tìm hiểu xem tính năng này có tồn tại không!)

+1

Có lẽ bạn nên đề cập rằng YourKit không tốn tiền. WMemoryProfiler là mã nguồn mở và miễn phí. Tôi cũng đã tìm thấy trên các trang web từ các trình biên tập commcercial ngoại trừ cho Yourkit không có bộ nhớ chụp nhanh chương trình Api. Những người khác chỉ có Apis cho ảnh chụp nhanh profiler hiệu suất. Nếu tính năng này tồn tại, tôi chắc chắn rằng tiếp thị sẽ đặt nó trên trang web của họ. –

0

Bạn có thể thử công cụ Intellitrace được cung cấp với phiên bản cuối cùng của studio trực quan. Đó là những gì bạn mô tả - nó ghi lại những gì đang xảy ra trong ứng dụng của bạn và cho phép bạn gỡ lỗi nó mà không thực thi chương trình của bạn bằng cách di chuột qua các biến và tất cả các cửa sổ gỡ lỗi khác để trợ giúp bạn.

0

Bạn có thể sử dụng PostSharp. Tôi thấy nó rất hữu ích để ghi lại thời gian gỡ lỗi vì ứng dụng môi trường đã được triển khai. Và thiết bị/ghi lại nhiều điều.

Nhưng rõ ràng bạn sẽ cần chỉ định tất cả các biến bạn cần ghi lại.

Kiểm tra thêm chi tiết here.

1

Đối với điều này bạn có thể sử dụng WMemoryProfiler để

  • Nhận tất cả các đối tượng trong tất cả appdomains như một mảng đối tượng
  • Tạo một bãi chứa ký ức về quá trình của riêng bạn
  • đối tượng cụ thể Serialize để đĩa

Để thực hiện điều này, bạn cần Windbg tất nhiên nhưng Api của WMemoryProfiler được quản lý đầy đủ và bạn về cơ bản có thể tự gỡ lỗi quá trình của bạn. Thư viện này sẽ xử lý các lỗi của trình gỡ rối thông thường vì nó quấn Windbg trong một thư viện dễ truy cập.

Mã bên dưới sẽ nhận tất cả các phiên bản của đối tượng System.Threading.Thread vào một mảng đối tượng. Bằng cách này, bạn có thể viết trình hiển thị trực quan cho các đối tượng ứng dụng của riêng bạn khi chạy. Quá tải khác chỉ đơn giản là cung cấp cho bạn tất cả các đối tượng trong tất cả các AppDomains.

using (var debugger = new MdbEng()) 
{ 
    var dummy = new Thread(() => {}); 
    dummy.Name = "Dummy Thread"; 

    // Get all thread objects in all AppDomains 
    var threads = debugger.GetObjects("System.Threading.Thread", true); 

    foreach (Thread t in threads) 
    { 
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name); 
    } 
    GC.KeepAlive(dummy); 
} 

Vì đó là trình bao bọc xung quanh Windbg bạn cũng có thể tạo một kết xuất bộ nhớ ngay sau đó để tải dữ liệu đối tượng để hiển thị từ bãi chứa. Profiler Memory Profilers (ví dụ MemoryProfiler từ Scitech) sử dụng kỹ thuật này từ nhiều năm nhưng nó khá chậm khi bạn có một vùng nhớ bộ nhớ khổng lồ vì chúng đang sử dụng Windbg như là dump analyzer.