2014-12-29 21 views
13

Tôi quen thuộc với DebuggerHiddenAttributeDebuggerStepThroughAttribute. Hôm nay tôi nhận thấy các DebuggerStepperBoundaryAttribute, và nếu tôi hiểu nó một cách chính xác, nếu bạn cố gắng F10 trên một tài sản (hoặc phương pháp hoặc bất cứ điều gì) có thuộc tính đó, nó sẽ biến thành một F5.Điều gì sẽ là một ví dụ sử dụng DebuggerStepperBoundaryAttribute?

Sử dụng DebuggerStepperBoundaryAttribute để thoát khỏi bước thông qua mã để chạy mã. Ví dụ, trong Visual Studio 2005, gặp phải một DebuggerStepperBoundaryAttribute trong khi bước qua mã bằng cách sử dụng phím F10 (hoặc lệnh Step Over) có cùng tác dụng như nhấn phím F5 hoặc sử dụng lệnh Bắt đầu gỡ lỗi.

Tôi không thể nghĩ ra một ví dụ cho rằng điều này hữu ích/hữu ích. Vì vậy, hoặc sự hiểu biết của tôi là sai, hoặc tôi không thể nghĩ ra một ví dụ tốt về cách nó sẽ hữu ích. Điều gì sẽ là một ví dụ sử dụng DebuggerStepperBoundaryAttribute sẽ hữu ích/hữu ích?

+0

Tôi có thể tưởng tượng nó có thể hữu ích nếu bạn có Trình lập lịch tác vụ hoặc điều gì đó tương tự và bạn đã kết thúc nhiệm vụ của mình. Thay vì bước trở lại vào mã khung công tác của bạn, nó sẽ chỉ cho phép Tác vụ kết thúc và sizzle vào nền. Nhưng cá nhân tôi đã không sử dụng nó. – jessehouwing

+0

Dường như rất khó hiểu đối với nhà phát triển đang gỡ lỗi. – usr

+0

@usr đó là những gì tôi nghĩ. – Daryl

Trả lời

1

Đây là một chương trình thử nghiệm đơn giản (Enable Just My Code, và đặt một điểm break trên đường thử nghiệm 1,2,3, & 4) nhắc đến bên dưới:

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestDebuggerStepperBoundary();      // Test 1 
     Test();            // Test 2 
     TestDebuggerNonUserCode(TestDebuggerStepperBoundary); // Test 3 
     TestDebuggerNonUserCode(Test);      // Test 4 
    } 

    [DebuggerNonUserCode] 
    private static void TestDebuggerNonUserCode(Action action) { action(); } 

    [DebuggerStepperBoundary] 
    private static void TestDebuggerStepperBoundary() { SomethingHorrible(); } 

    [DebuggerNonUserCode] 
    private static void Test() { SomethingHorrible(); } 

    private static void SomethingHorrible() 
    { 
     var foo = "bar"; 
    } 
} 

Sau reviewing the definition for DebuggerStepperBoundaryAttribute, I don' t nghĩ rằng định nghĩa là hoàn toàn đúng:

thuộc tính DebuggerStepperBoundaryAttribute được sử dụng như một lối thoát từ ảnh hưởng của một DebuggerNonUserCodeAttribute.

Bạn có thể sử dụng DebuggerStepperBoundaryAttribute mà không nằm trong ngữ cảnh của DebuggerNonUserCodeAttribute. F11 trên Thử nghiệm 1 ngay lập tức chạm vào điểm ngắt tiếp theo trong Bài kiểm tra 2, mà không bị "hiệu ứng của DebuggerNonUserCodeAttribute". Tôi nghĩ rằng điều này thực sự nên đọc "Thuộc tính DebuggerStepperBoundaryAttribute được sử dụng như một lối thoát từ hiệu ứng của Bước vào hoặc Bước Trong khi gỡ lỗi." Phần còn lại của defintion có ý nghĩa:

Khi thực hiện trong ranh giới của DebuggerNonUserCodeAttribute, thiết kế-cung cấp mã được thực thi như một bước qua cho đến khi sử dụng mã được cung cấp tiếp theo là gặp phải. Khi các công tắc ngữ cảnh được thực hiện trên luồng , mô-đun mã do người dùng cung cấp tiếp theo được bước vào có thể không liên quan với mã đang trong quá trình được gỡ lỗi. Để tránh trải nghiệm gỡ lỗi này, hãy sử dụng DebuggerStepperBoundaryAttribute để thoát khỏi bước qua mã để chạy mã. Ví dụ: trong Visual Studio 2005, gặp DebuggerStepperBoundaryAttribute khi bước qua mã bằng phím F10 (hoặc lệnh Step Over) có tác dụng tương tự như nhấn phím F5 hoặc sử dụng lệnh Bắt đầu Gỡ lỗi.

Vì vậy, để trả lời câu hỏi của tôi, nếu có một số mã khác mà bạn đã gọi, mà bạn không thể/không muốn thêm DebuggerStepThrough, DebuggerNonUserCode, hoặc DebuggerHidden tới, nhưng nếu debugger vào phương pháp này sẽ được nhiều hơn chói tai hơn là đi từ bước mã để chạy mã, sau đó sử dụng DebuggerStepperBoundaryAttribute.(Trong chương trình ví dụ của tôi, F11 trên Bài kiểm tra 2, đưa bạn trực tiếp đến SomethingHorrible, có khả năng tồi tệ hơn việc chuyển thẳng sang hoạt động (F5)) Thêm một cách rõ ràng thêm Chuyển ngữ cảnh Chủ đề, và bên ngoài đó, tôi không biết về bất kỳ tình huống sẽ hữu ích.

+0

đánh dấu câu trả lời của bạn là câu trả lời ... – pashute

0

[DebuggerStepperBoundary] theo nghĩa đen có nghĩa là có một ranh giới gỡ lỗi. trình gỡ lỗi thường sẽ nhảy qua điều này (cho dù bạn yêu StepInto bao nhiêu), NHƯNG NÊN CHO PHÉP bạn đặt một điểm ngắt, và trong trường hợp đó, nó sẽ phá vỡ. Nhưng hành vi thông thường sẽ là nhảy qua chức năng này (chạy qua).

[DebuggerStepThrough] này có nghĩa là bạn không bao giờ có thể phá vỡ ở đây. nếu bạn cố gắng đặt điểm ngắt, nó sẽ xuất hiện bị tắt miễn là "Chỉ Mã của tôi" được chọn. thường được sử dụng cho Properties và LINQ và như vậy

Khi bạn dùng chương trình này:

Tôi có một ứng dụng có sử dụng user32.dll để gửi tổ hợp phím để một ứng dụng nhất định. Tôi đặt DebuggerStepThrough trên 90% các chức năng này vì chúng không có ảnh hưởng nếu chúng được chia thành. Họ cần phải chạy như một toàn thể.

Hy vọng điều này sẽ trả lời câu hỏi của bạn

+0

Tôi giả sử bạn có nghĩa là "NHƯNG" IT' "không IN. Vì vậy, là sự khác biệt duy nhất giữa StepThrough và StepperBoundary, mà bạn không thể thiết lập một điểm break trong StepThrough, trừ khi "Just My Code" được chọn? – Daryl

+0

có, anh chị em của nó [DebuggerNonUserCode] được sử dụng bởi mã được tạo và StepThrough là mã không phải do anh chị em tạo mã trực tiếp. –

+0

DebuggerstepNhững gì tôi sử dụng cho những thứ tôi biết một nhà phát triển khác sẽ rơi vào. giống như ví dụ về sendkeys của tôi hoặc thuộc tính đơn giản, và boudary khi tôi chỉ không muốn nhìn thấy nó trong khi gỡ lỗi –

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