2010-03-05 30 views
28

Tôi có một dự án thử nghiệm đơn vị dựa trên UnitTest ++. Tôi thường đặt một breakpoint vào dòng cuối cùng của mã để tôi có thể kiểm tra giao diện điều khiển khi một trong các bài kiểm tra thất bại:Visual Studio - có thể là điểm ngắt được gọi là mã không?

n = UnitTest::RunAllTests(); 
    if (n != 0) 
    { 
    // place breakpoint here  
    return n; 
    } 
    return n; 

Nhưng tôi phải lắp lại nó mỗi khi tôi check-out mã một lần nữa từ SVN. Có thể hơi đặt breakpoint bởi trình biên dịch ?:

 n = UnitTest::RunAllTests(); 
     if (n != 0) 
     { 
     // place breakpoint here  
#ifdef __MSVC__ 
     @!!!$$$??___BREAKPOINT; 
#endif 
     return n; 
     } 
     return n; 
+0

Ông có thể vui lòng đổi gian hỏi Chức vụ? Đây không chỉ là vấn đề của Visual Studio mà còn thú vị cho các trình biên dịch khác. – MaBe

Trả lời

50

Sử dụng __debugbreak() nội tại (yêu cầu bao gồm <intrin.h>).

Sử dụng __debugbreak() thích hợp hơn khi viết trực tiếp __asm { int 3 } vì không cho phép lắp ráp nội tuyến khi biên dịch mã cho kiến ​​trúc x64.

Và đối với hồ sơ, trên Linux và Mac, với GCC, tôi đang sử dụng __builtin_trap().

+1

Có lẽ tôi đang thiếu một cái gì đó nhưng đó là '__debugbreak()' - không gạch dưới ở giữa. – NPS

+0

thực sự! cảm ơn bạn đã báo cáo lỗi đánh máy –

+0

Cảm ơn! Điều này làm việc cho mingw quá. – MaBe

0

Làm thế nào về việc sử dụng một Debug hoặc vết phương pháp để sản xuất các thông tin điều khiển. Đó có thể là một cách tiếp cận tốt hơn là dựa vào các điểm ngắt.

+0

Khuôn khổ UnitTest ++ thực hiện đầu ra. Tôi chèn các câu lệnh như KIỂM TRA (pi <4); và nếu pi là 31, khuôn khổ sẽ in ra lỗi. Có 500 bài kiểm tra và con số này đang tăng lên. Họ thường không thất bại. – danatel

0

Bạn có thường xuyên kiểm tra dự án từ SVN không? Đây thường là một cái gì đó tôi chỉ làm một lần cho mỗi dự án, hoặc khi tôi xây dựng lại máy tính của tôi.

Nếu bạn cũng kiểm tra tệp dự án, các điểm ngắt phải được lưu trữ trong tệp dự án.

Tôi nghĩ rằng nó nằm trong tệp .suo. Bạn cũng có thể đặt điều đó dưới sự kiểm soát SVN nếu bạn muốn, mặc dù tôi không muốn.

+0

Thường xuyên nhất có thể để đảm bảo rằng tất cả các tệp mới đã được thêm trước khi cam kết và không có phụ thuộc nào bị thiếu. Nó cũng là tốt đẹp để giữ thư mục xây dựng cũ trên đĩa để có thể truy cập nhanh đến các phiên bản cũ của nhị phân. – danatel

+0

Điểm tốt. Chúng tôi cũng xây dựng thử nghiệm khói và điều đó không xảy ra với tôi. – codenheim

18
DebugBreak(void) 

Từ Winbase.h.

MSDN

+1

Tôi muốn thêm [quote from MSDN] này (https://msdn.microsoft.com/en-us/library/ea9yy3ey.aspx) về sự khác biệt giữa 'DebugBreak' và' __debugbreak': _Because DebugBreak là một gọi đến một chức năng hệ thống, các biểu tượng gỡ lỗi hệ thống phải được cài đặt để đảm bảo thông tin ngăn xếp cuộc gọi chính xác được hiển thị sau khi ngắt. Nếu không, thông tin ngăn xếp cuộc gọi được trình gỡ rối hiển thị có thể bị tắt bởi một khung. Nếu bạn sử dụng __debugbreak, ký hiệu là không bắt buộc._ –

7

Bạn có thể sử dụng điều này trong C hoặc C++

__asm 
{ 
    int 3 
} 
+1

chỉ hoạt động cho x86 mặc dù trình biên dịch không cho phép bạn viết lắp ráp nội tuyến cho x64 –

+0

+1 Mang lại những kỷ niệm trở lại. – Robert

3

Nếu bạn đang sử dụng VC6 (vâng, lỗi thời nhưng vẫn được sử dụng ở một số nơi/dự án), DebugBreak() sẽ làm việc nhưng bạn có thể kết thúc ở một số vị trí mơ hồ sâu với Windows DLL, từ đó bạn phải đi bộ ngăn xếp trở lại vào mã của bạn.

Đó là lý do tại sao tôi đang sử dụng ASSERT() bằng MFC hoặc assert() trong mã "chuẩn".

dụ của bạn sẽ làm việc như thế này:

n = UnitTest::RunAllTests(); 
ASSERT(n == 0); 
//assert(n == 0); 
return n; 

Nếu bạn không cần một kết quả và muốn nó chỉ để gỡ lỗi, bạn cũng có thể làm

if(0 != UnitTest::RunAllTests()) 
{ 
    ASSERT(FALSE); 
    //assert(false); 
} 
Các vấn đề liên quan