2011-09-19 16 views
15

Trong một cuộc thảo luận gần đây với người quản lý của tôi, ông đã đề cập rằng một trong những khách hàng cũ của ông đã sử dụng macro C++ để ghi lại thông tin về mọi dòng mã. Tất cả những gì họ phải làm là kích hoạt biến môi trường trước khi bắt đầu chạy. (Tất nhiên các biến môi trường đã được kích hoạt trong các thử nghiệm giường một mìnhC++ macro để ghi lại mọi dòng mã

Nhật ký đề cập đến các biến sử dụng và giá trị tương ứng của họ quá Ví dụ, đối với các dòng:..

a = a + b; 

Nhật ký sẽ nói cái gì đó như:

"a = a + b; (a = 5 + 3)" 

Cá nhân, tôi đã không chắc chắn nếu điều này là có thể, nhưng ông rất chắc chắn điều này đã tồn tại, mặc dù ông không nhớ những chi tiết cụ thể của mã

.

Vì vậy, đây là câu hỏi (hiển nhiên): Điều này có khả thi không? Bạn có thể cung cấp mã cho cái này không?

+0

Trong câu hỏi của bạn, tôi đang gói dấu ngoặc kép cho thông điệp log (để chứng minh rằng đó là một thông điệp log). Hy vọng nó là ok. – iammilind

+0

Không có điều gì giống như macro C++ và điều này chắc chắn không thể thực hiện với macro tiền xử lý vani. Một số công cụ khác phải tạo chuỗi giá trị. – spraff

+1

Tôi không nghĩ rằng có thể đăng nhập các dòng trống như "a = a + b", nhưng sử dụng macro trong dòng như "LOG (a = a + b)" là có thể và khẳng định macro đang thực hiện. – Dialecticus

Trả lời

18

Tôi không biết nếu mỗi dòng/biến có thể được mở rộng như vậy, nhưng các cuộc gọi chức năng có thể được ghi lại. Tôi đã ghi lại tất cả các cuộc gọi chức năng bằng cách sử dụng tùy chọn -finstrument-functions của gcc. Nó sẽ gọi:

void __cyg_profile_func_enter (void *this_fn, void *call_site); 

void __cyg_profile_func_exit (void *this_fn, void *call_site); 

cho chức năng nhập và thoát.

The docs explain how to use it. Tôi không biết liệu các trình biên dịch khác có cung cấp nội dung tương tự hay không.

+2

+1 cho tìm kiếm thú vị – trojanfoe

+1

MSVC++ có '/ Gh' và'/GH' cho '_penter()' và các hàm '_pexit()', được gọi ở đầu và cuối của mỗi hàm, tương ứng: http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

Bạn có thể kiểm tra cách BOOST_CHECKA from Boost.Test is implemented. Bên trong nó sử dụng các mẫu biểu thức.

Đối với thử nghiệm:

#define BOOST_TEST_MAIN 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/test_tools.hpp> 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    int a=0; 
    int b=1; 
    int c=2; 
    BOOST_CHECKA(a+b == c); 
} 

Output là:

Running 1 test case... 
main.cpp(11): error: in "test1": check a+b == c failed [0+1!=2] 

*** 1 failure detected in test suite "Master Test Suite" 

giá trị Ghi chú trong ngoặc vuông: [! 0 + 1 = 2]

Nó có một số hạn chế.

Đối với thử nghiệm:

BOOST_CHECKA((a+b) == c); 

đầu ra là:

check (a+b) == c failed [1!=2] 
Các vấn đề liên quan