2011-08-03 28 views
16

Có thể tìm kiếm bên trong một đối tượng cho các giá trị và/hoặc trường khác trong khi gỡ lỗi ứng dụng C# không? Tôi đang tìm kiếm tìm kiếm sâu có thể tìm hiểu đối tượng ở nhiều cấp độ.Tìm kiếm trong chế độ gỡ lỗi bên trong một đối tượng

Điều tôi đang tìm kiếm là cách tìm kiếm (như F3 để tìm kiếm tài liệu) bên trong các đối tượng rất phức tạp (ví dụ: trong khi đang sửa lỗi, trong cửa sổ Xem nhanh).

+0

Hãy thử sử dụng F10 hoặc F11 để tiếp tục sử dụng các đối tượng của bạn. Ngoài ra, có chức năng tích hợp để xem giá trị đối tượng, vv – diceler

+0

Tôi nghĩ bạn cần phải cụ thể hơn những gì bạn muốn nói "tìm kiếm" để có được câu trả lời tốt hơn. Tôi chỉ giả định nó có nghĩa là để có thể truy cập các giá trị. Vậy bạn muốn tìm kiếm điều gì? Loại tài sản? Làm thế nào bạn có thể tìm kiếm các giá trị nếu thuộc tính không phải là chuỗi, số hoặc bool? Đưa ra một ví dụ về những gì bạn muốn có thể làm. – Yuf

Trả lời

11

Bạn có thể sử dụng OzCode (một phần bổ trợ cho Visual Studio), cho phép bạn search cho các thành viên bạn muốn xem từ trong cửa sổ bật lên dữ liệu di chuột hoặc cửa sổ QuickWatch.

Xem ví dụ trong hình bên dưới:

Search Feature

Họ và tiết lộ: Tôi là người đồng sáng lập của "OzCode".

+0

Đáng buồn thay, trang web đã biến mất (thay thế bằng spam của công cụ tìm kiếm) và tôi không thể tìm thấy tiện ích này ở bất kỳ đâu trên thư viện tiện ích mở rộng. – Kcoder

+1

@Kcoder Xin lỗi, sản phẩm đã được đổi tên thành [OzCode] (http://www.oz-code.com) cách đây nhiều năm. –

1

Tôi nghĩ rằng không có tính năng tích hợp sẵn để cho phép bạn, đi sâu vào các đối tượng trong chế độ gỡ lỗi, Trừ khi sử dụng tiện ích mở rộng nếu có.

+0

cảm ơn bạn đã bỏ phiếu, nhưng như bạn có thể thấy @Shahar đã viết 'tìm kiếm', điều đó có nghĩa là tính năng để nhập nội dung nào đó vào đó và tìm kiếm nó. Tất nhiên bạn có thể điều hướng trong đối tượng trong debug, tôi có nghĩa là không có tính năng tích hợp để tìm kiếm trong các đối tượng. – saber

-1

Khi bạn đang ở chế độ gỡ lỗi, hãy chuyển tới Debug trên thanh menu và chuyển đến menu thả xuống của cửa sổ. Ở đó, bạn sẽ thấy người dân địa phương. Điều này sẽ cho bạn biết giá trị của các biến của bạn là gì tại các điểm ngắt hiện tại của bạn. Bạn cũng có thể đi sâu vào tất cả các đối tượng của bạn cũng như thông qua một trình đơn cây. Để tìm một đối tượng cụ thể, bạn có thể xem và sau đó nhập biến mà bạn muốn xem ở đó. Hãy chắc chắn rằng bạn có các điểm ngắt ở đúng nơi. Chúc may mắn!

+0

Điều này không trả lời câu hỏi của OP –

1

Bên cạnh bài Wilson Kao, bạn cũng có thể thử phương pháp đơn giản nhất mà tôi sử dụng:

  1. Đặt một breakpoint ở một nơi mà một biến tham chiếu đến đối tượng sẽ được sử dụng.
  2. Di chuột qua biến khi điểm ngắt được nhấn. Bạn sẽ thấy cửa sổ bật lên hiển thị các thuộc tính cấp cao nhất của đối tượng.
  3. Sử dụng các nút nhỏ + ở bên trái để đi sâu hơn vào đối tượng. Nó có thể gây nhầm lẫn.

Bạn cũng có thể ghim một số thuộc tính mà bạn tìm thấy trong sâu thẳm, do đó bạn không cần phải tìm kiếm chúng một lần nữa và một lần nữa (nút pin xuất hiện ở bên phải của mỗi tài sản khi bạn di chuột qua bất động sản)

Dưới đây là một exmaple về những gì nó trông giống như (biến là sách): Example

Nguồn: http://blogesh.wordpress.com/2008/09/09/visual-studio-debugging-tips-and-tricks/

Edit: có một cách để có được tất cả các thuộc tính và giá trị của họ mà bạn truy cập thông qua hướng dẫn phương pháp di chuột và nhấp chuột (ví dụ: trong hình trên, bạn có thể nhận ISBN và giá trị của nó thông qua mã). Tuy nhiên bạn phải sử dụng mã Visual Basic. Sau đó, bạn có thể thực hiện tìm kiếm trên các kết quả cho một giá trị cụ thể.

Trước tiên, bạn cần phải đi đọc lên trên Tracepoints và tùy chỉnh Macros: Click and go to "TracePoints – Running a Custom Macro" Also, here

Tiếp theo, bạn cần phải thực hiện một Macro để làm những gì bạn muốn. Trong Visual Studio, hãy truy cập Công cụ -> Macro -> Macro IDE ... Thêm Macro mới. Nên có một trống đặt trước được gọi là Module 1. Ở đây, bạn thêm các thói quen để làm những gì bạn muốn. Sau đây là một Macro tôi đã thực hiện sẽ đi qua một biến nhất định và xuất ra các thuộc tính của nó (về cơ bản, xuất dữ liệu bạn nhận được trong phương thức cover-and-click). Kết quả đầu ra này cho cửa sổ Output, mà bạn có thể mở thông qua View -> Output.

Sub DisplayAllProperties() 
    Dim outputWindow As EnvDTE.OutputWindow 
    outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object 

    Dim currentStackFrame As EnvDTE.StackFrame 
    currentStackFrame = DTE.Debugger.CurrentStackFrame 

    outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf) 

    For Each exp As EnvDTE.Expression In currentStackFrame.Locals 
     If (exp.Name = "this") Then ' Here, I am only searching in a variable named "this" 
      outputWindow.ActivePane.OutputString("- " + exp.Name + ": " + exp.Value.ToString() + vbCrLf) 

      helperDisplay(exp.DataMembers, outputWindow, 1) 
     End If 

    Next 
End Sub 

Private Sub helperDisplay(ByRef exps As EnvDTE.Expressions, ByRef OutputWindow As EnvDTE.OutputWindow, ByVal n As Integer) 

    For Each ex In exps 
     helperTabs(n, OutputWindow) 

     If (ex.Name = "Non-Public members" Or ex.Name = "Static members") Then 
      OutputWindow.ActivePane.OutputString("~ " + ex.Name + ": There are " + ex.DataMembers.Count.ToString + vbCrLf) 
     Else 
      OutputWindow.ActivePane.OutputString("~ " + ex.Name + ": " + ex.Value.ToString() + vbCrLf) 
      If (ex.DataMembers.Count <> 0) Then 
       helperDisplay(ex.DataMembers, OutputWindow, n + 1) 
      End If 
     End If 
    Next 

End Sub 

Private Sub helperTabs(ByVal n As Integer, ByRef OutputWindow As EnvDTE.OutputWindow) 
    For i = 1 To n Step 1 
     OutputWindow.ActivePane.OutputString(vbTab) 
    Next 
End Sub 

Mã này cho tôi ngoại lệ đối với một số điều khiển DevExpress mà tôi đã thử nghiệm. Tôi nghĩ rằng đó là bởi vì một số giá trị không thể được truy cập.Tôi chưa bao giờ được mã hóa trong VB trước đây vì vậy có thể có lỗi trong đó ... Chơi với nó và xem nếu nó có thể làm những gì bạn muốn (tức là đầu ra chỉ các thuộc tính phù hợp với những gì bạn cần). Phần tốt là, bạn có thể thay đổi mã Macro như bạn đang gỡ lỗi, vì vậy không cần phải dừng dự án của bạn trong khi bạn chỉnh sửa Macro!

Để sử dụng Macro, bạn cần đặt điểm ngắt ở đâu đó trong mã của bạn sẽ bị truy cập và sẽ có thể truy cập đối tượng bạn muốn. -> Nhấp chuột phải vào điểm ngắt và đi đến Khi nhấn ... Hãy kiểm tra Chạy macro: và chọn Macro của bạn từ trình đơn thả xuống.

+0

Hướng dẫn đi bộ bên trong một đối tượng tôi biết, ghim mà tôi không nhận thấy điều nào là tuyệt vời! :) Nhưng những gì tôi đang tìm kiếm là một cách để tìm kiếm (như F3 để tìm kiếm tài liệu) bên trong các đối tượng rất phức tạp. Trong ví dụ đã cho, nó sẽ tìm kiếm các trường có tên 'Tiêu đề' hoặc cho các giá trị có chứa 'Phần Web'. Tôi không thể tìm thấy nó trong định nghĩa của đối tượng bởi vì tôi không có mã nguồn. – Shahar

+0

Oh ok. Tôi đã có ý tưởng sử dụng macro tùy chỉnh trong TracePoints mà trình gỡ lỗi của Visual Studio cung cấp. Vì vậy, tôi googled nó và tìm thấy bài đăng này: http://stackoverflow.com/questions/5275078/search-for-a-value-in-an-object-at-runtime-quickwatch-enhancement Thật buồn cười vì liên kết nó cung cấp là tôi cũng đã học về TracePoints từ! Ngôn ngữ macro là trong VB mặc dù. – Yuf

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