2010-10-20 28 views
23

Tôi cố gắng để gỡ lỗi một ứng dụng hình thức cửa sổ trong đó có một số lượng lớn các sự kiện: Nút ép, timers, vv ..Gỡ rối tất cả các sự kiện trong Visual Studio 2010 mà không cần thiết lập điểm break

Có cách nào để bắt tất cả dòng mã đang được thực thi bởi ứng dụng mà không cần thiết lập một điểm ngắt?

chỉnh sửa: Chương trình không được viết bởi tôi, vì vậy tôi không quen với mã. Tôi muốn bước qua toàn bộ chương trình, bắt mọi dòng mã đang được thực thi. Thiết lập các điểm ngắt trong mọi sự kiện là không thực tế vì các điều khiển khác nhau được tạo động.

+0

Gỡ lỗi là tập trung sự chú ý của bạn vào một vài điểm cụ thể, không vi phạm từng hướng dẫn nếu bạn hỏi tôi. –

Trả lời

0

Không thực sự, nhưng bạn có thể đặt một điểm ngắt và một bước (F10/F11) thông qua phần còn lại của mã.

+1

Cảm ơn bạn đã trả lời nhanh. Nhưng vấn đề là tôi không thể bắt các mã đang chạy trong các sự kiện –

+0

@Ying - Bạn cần đặt điểm ngắt của bạn bên trong trình xử lý sự kiện phương thức (trừ khi tôi đã bỏ lỡ bạn đọc) – Justin

+1

Vấn đề là giải pháp này là không thực tế vì chương trình lớn và phức tạp –

0

Nope không sợ - bạn cần phải tự đặt từng điểm ngắt.

Nếu nó giúp F9 là phím tắt để gán điểm ngắt - chỉ cần đặt điểm ngắt ở đầu mỗi phương thức và sử dụng bước (F10)/bước vào (F11) từ đó.

1

Tại sao bạn muốn chia nhỏ trên mọi dòng? Điều này sẽ rất nguy hiểm và mất thời gian. Nếu bạn muốn xem hoạt động của chương trình của bạn khi nó thực thi, hãy sử dụng cơ chế ghi nhật ký hoặc Debug.Writeline để xuất thông tin đến cửa sổ ngay lập tức.

+0

Tôi đã sử dụng sai thuật ngữ gỡ lỗi. Chương trình không được viết bởi tôi, vì vậy tôi không quen với hoạt động của nó. Tôi muốn có thể bước qua từng dòng để xem nó hoạt động như thế nào. –

+0

Bạn có thể đặt điểm ngắt tại dòng đầu tiên thực hiện, sau đó thực hiện từng bước (không thể nhớ lối tắt bàn phím.) –

+5

Tôi có thể đang làm sai .. nhưng từ kinh nghiệm của tôi, điều này không bắt mã được chạy trong các sự kiện mà không cần sử dụng các điểm ngắt. –

1

Bạn không thể theo dõi các dòng mã, nhưng bạn có thể sử dụng các cuộc gọi Trace.TraceInformation nơi bạn muốn có ý tưởng về những gì được thực thi. Ngoài ra còn có Debug.Write. Cả hai đầu ra sẽ viết trong cửa sổ đầu ra của Visual Studio.

Một giải pháp khác là thêm ghi nhật ký vào ứng dụng của bạn, ví dụ với log4net, nhưng có thể quá mức cần thiết cho nhu cầu của bạn.

1

Đây không phải chính xác những gì bạn đang yêu cầu, nhưng trong trường hợp bạn không biết bạn có thể bật hoặc tắt điểm ngắt hiện có. Trong trường hợp của bạn, bạn có thể thêm điểm ngắt tại các địa điểm chính trong toàn bộ mã của bạn và chỉ vô hiệu hóa chúng khi bạn không muốn gỡ lỗi chúng. Bằng cách đó, bạn sẽ có thể kích hoạt lại chúng sau này khi bạn muốn sử dụng lại chúng.

Bật/tắt có sẵn thông qua cửa sổ Breakpoints được tìm thấy trong menu Debug> Windows> Breakpoints (CTRL + D, B). Bạn cũng có thể bao gồm cột "Chức năng" và "Tệp" trong cửa sổ, có thể giúp bạn xác định điểm ngắt nào trong trình xử lý sự kiện mà bạn quan tâm về

9

Bạn cũng có thể thử công cụ bảo vệ mã.

Ví dụ: nếu bạn có ResharperdotCover, bạn có thể chạy ứng dụng của mình (qua mục menuCửa sổ ứng dụng bao gồm) và khi ứng dụng kết thúc, dotCover sẽ cho bạn biết dòng mã nào được chạy trong IDE VS bằng cách làm nổi bật chúng bằng màu xanh lá cây. Các dòng mã không chạy được tô màu đỏ.

Tôi không biết nếu có các công cụ khác thực hiện việc này, nhưng đó là một tùy chọn.

10

Nếu bạn đang sử dụng phiên bản Ultimate của Visual Studio 2010, bạn có thể sử dụng tính năng mới của nó được gọi là IntelliTrace (trước đây là Debugger lịch sử). Điều này sẽ cho phép bạn thực hiện chính xác những gì bạn muốn - có thể xem tất cả các cuộc gọi phương thức và sự kiện đã xảy ra trong quá trình thực hiện chương trình của bạn và bạn sẽ có thể quay lại sự kiện bạn cần.

Để bật IntelliTrace, hãy truy cập Tools → Options → IntelliTrace và chọn hộp kiểm "Bật IntelliTrace" và chọn một trong hai chế độ: "chỉ sự kiện" hoặc "sự kiện và thông tin cuộc gọi", sau đó chạy ứng dụng của bạn bằng trình gỡ rối (F5) .

Sự khác biệt giữa hai chế độ là sau này sử dụng các hồ sơ để thu thập tất cả thông tin chạy, để bạn có được một cuộc gọi stack hoàn tất, tuy nhiên bạn sẽ không thể sử dụng chỉnh sửa-and-tiếp tục tính năng của trình gỡ rối.

Bạn có thể tìm thêm trong số này series of articles và tất nhiên, trên MSDN.

+0

điều này nghe có vẻ giống như giải pháp hoàn hảo cho tôi. Nó có sẵn cho chuyên nghiệp không? Tôi hiện đang nghiên cứu điều này và sẽ cập nhật –

+0

Thật không may, đây là một trong những tính năng chỉ có sẵn với Visual Studio Ultimate: ( –

+0

Ngoài ra, tôi tin rằng bạn có thể tải xuống [phiên bản dùng thử Ultimate] (http: // www. microsoft.com/downloads/en/details.aspx?FamilyID=06a32b1c-80e9-41df-ba0c-79d56cb823f7) –

11

Đối gỡ một nút bấm mà không breakpoint thiết:

  1. Khởi động ứng dụng với trình gỡ rối.
  2. Chuyển đến trạng thái ngay trước khi nhấp chuột dự định.
  3. Quay lại trình gỡ rối và nhấn Tạm dừng rồi F11 (Bước vào) - không có gì xảy ra.
  4. Chuyển đến ứng dụng và nhấn nút - trình gỡ lỗi sẽ tiếp nhận và thả bạn vào trình xử lý sự kiện.

Lưu ý: Điều này sẽ không hoạt động nếu Sơn, bất kỳ sự kiện Chuột hoặc một số sự kiện khác được xử lý. Trình gỡ rối sẽ thả bạn vào các trình xử lý đó bất cứ khi nào bạn thử các bước ở trên.

+0

Không thể tin rằng tôi đã không sử dụng "Break All" - chính xác những gì tôi cần. – Rob3C

+0

Bạn có ý gì khi tạm dừng? Tôi chỉ thấy một nút "Break All", và nó không hoạt động cho phương thức của bạn. –

+0

@ Dgrin91: Đây là 3,5 năm trước nhưng _that không hoạt động_ không có nhiều trợ giúp. Có lẽ một câu hỏi mới là theo thứ tự. –

2

Tôi đã phát triển công cụ Runtime Flow để giải quyết chính xác vấn đề này - để hiểu một codebase .NET không quen thuộc thông qua giám sát cuộc gọi chức năng thời gian thực. Nó tương tự như IntelliTrace, nhưng chú trọng hơn vào luồng điều khiển hơn là gỡ lỗi.

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