2011-11-14 44 views
17

Tôi thường thấy mình đặt điểm ngắt A ở đâu đó trong mã và bật thủ công một hoặc nhiều điểm ngắt khi điểm ngắt này được nhấn. Một trường hợp điển hình là khi tôi gỡ lỗi một cách không liên quan và không quan tâm đến các bài kiểm tra trước đó.Bật điểm ngắt B nếu điểm ngắt A bị trúng

void testAddZeros() 
{ 
    Number a(0); 
    Number b(0); 
    Number result = a.add(b); 
    assert((a + b) == Number(0)) 
} 
void testAddOnes() 
{ 
    Number a(1); 
    Number b(1); 
    Number result = a.add(b); 
    assert((a + b) == Number(2)); 
} 
void testAddNegativeNumber() 
{ 
    Number a(1); 
    Number b(-1) 
    Number result = a.add(b); 
    assert((a + b) == Number(0)); 
} 

Hãy tưởng tượng nếu testAddZeros()testAddOnes() chạy tốt, nhưng testAddNegativeNumber(). Trong trường hợp này, thiết lập một điểm ngắt tại Number result = a.add(b); sẽ là một nơi tự nhiên để bắt đầu gỡ lỗi. Bây giờ hãy tưởng tượng rằng lỗi nằm ở đâu đó sâu bên trong Number::add, vì vậy chúng tôi không thực sự can thiệp vào những thứ xảy ra sớm trong Numbers::add. Những gì tôi muốn làm là thiết lập một điểm dừng ở đâu đó bên trong Numbers::add mà chỉ kích hoạt nếu tôi ở trong thử nghiệm testAddNegativeNumber().

Có cách nào để tự động bật điểm ngắt B khi ngắt điểm A bị truy cập không?

+1

Bạn đã kiểm tra điểm ngắt có điều kiện chưa? Có lẽ bạn có thể sử dụng điều kiện mà trên đó breakpoint A được nhấn để kích hoạt 'có điều kiện' breakpoint B. (Trong trường hợp đó bạn không cần breakpoint A nữa) – ChristiaanV

+0

@ChristiaanV: vâng, nhưng tôi sợ các điểm ngắt có điều kiện sẽ không đủ trong trường hợp này - ít nhất là không nói chung. – larsmoa

+0

Bạn có thể hiển thị mẫu mã, nơi bạn muốn sử dụng mẫu này không? – ChristiaanV

Trả lời

19

Bạn có thể nhận điểm ngắt phụ thuộc ngay cả khi không thay đổi mã, bằng cách sử dụng một số lưu trữ chung để giữ điểm đánh dấu cho phép điểm ngắt phụ thuộc.

Một trong những kho lưu trữ dễ tiếp cận nhất mà tôi đã tìm thấy là thuộc tính tùy chỉnh miền ứng dụng. Chúng có thể được truy cập bằng các phương thức System.AppDomain.CurrentDomain.GetData và SetData.

Vì vậy, trên breakpoint đầu tiên bạn xác định một "khi nhấn" thiết lập với:

{System.AppDomain.CurrentDomain.SetData ("phá vỡ", true)}

breakpoint condition

Trên điểm ngắt phụ thuộc, đặt điều kiện lần truy cập thành:

System.AppDomain.Current Domain.GetData ("break")! = Null

+0

Tôi đã tự hỏi liệu loại điều này có phù hợp với tracepoint ... bây giờ tôi biết. Đã bỏ phiếu! – codekaizen

2

này là khoảng tốt nhất tôi nghĩ rằng bạn có thể làm, nhưng có vẻ như quá lớn của một hack để thậm chí cố gắng, vì nó liên quan đến việc thêm một biến ...

string breakpointToStopOn = string.Empty; 
Console.WriteLine("HERE"); // You can set breakpoint A here, 
          // with a condition (right click on the breakpoint, then selectCondition), 
          // that sets breakpointToStopOn = "A" 
Console.WriteLine("B"); // and you can set your breakpoint here with this condition 
         // (breakpointToStopOn == "A"); 

Bạn sẽ không thực sự có thể dừng trên dòng Console.WriteLine ("HERE"), nhưng bạn có thể bật hoặc tắt điểm ngắt, điều này sẽ có hiệu lực cho phép điểm ngắt khác.

Hãy coi chừng, các câu lệnh breakpoint có điều kiện sẽ làm suy giảm nghiêm trọng hiệu suất của ứng dụng của bạn trong khi gỡ lỗi.

+0

Mặc dù nó không phải là những gì tôi đang tìm kiếm, tôi đoán đây là đề nghị tốt nhất (tốt, chỉ). – larsmoa

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