2012-12-09 25 views
6

Tôi đang gỡ lỗi một hàm C++ rất phức tạp mang lại cho tôi một số kết quả không mong muốn trong một số đầu vào. Tôi muốn so sánh thực thi mã theo đầu vào khác nhau để tôi tìm ra phần nào gây ra lỗi cho tôi. Công cụ có thể so sánh đường dẫn thực thi mã là những gì tôi đang tìm kiếm. Vui lòng cho tôi biết nếu một công cụ như vậy tồn tại. Hoặc nếu không, nếu có một số kỹ thuật tôi có thể sử dụng để làm điều tương tự?So sánh các đường dẫn thực hiện của cùng một mã trong các đầu vào khác nhau

Để mô tả cụ thể vấn đề của tôi, ở đây tôi đang sử dụng một ví dụ giả tạo.

nói đây là các chức năng trong giả,

double payTax(double income) 
{ 
    if (income < 10000) 
     return noTax(); 
    else if (10000 < income < 30000) 
     return levelOneTax(); 
    else if (30000 < income < 48000) 
     return levelTwoTax(); 
    else 
     return levelThreeAboveTax(); 
} 

Với đầu vào 15000, chức năng tính toán đúng số thuế, nhưng bằng cách nào đó đầu vào 16000 đưa ra một số thuế có sai sót. Giả sử, đầu vào 15000 và 16000 sẽ làm cho hàm đi qua chính xác các đường dẫn thực hiện tương tự; mặt khác, nếu chúng đi theo những con đường khác nhau, thì cái gì đó đã đi sai trong hàm. Do đó, một công cụ so sánh đường dẫn thực hiện sẽ tiết lộ đủ thông tin có thể giúp tôi nhanh chóng xác định lỗi. Tôi đang tìm một công cụ như vậy. Tốt hơn là tương thích với Visual Studio 2010. Nó sẽ là tốt hơn nếu như một công cụ cũng giữ giá trị của các biến.

P.S. gỡ lỗi là điều cuối cùng tôi muốn làm vì cơ sở mã mà tôi đang làm việc lớn hơn nhiều và phức tạp hơn ví dụ payTax tầm thường.

Vui lòng trợ giúp. Cảm ơn.

+0

Bạn đã bật và chạy Visual Studio 2010 chưa? Nếu vậy, bạn đã thử đặt một điểm ngắt ở đầu hàm 'payTax()', và sau đó chạy chương trình trong trình gỡ rối? –

+0

Có. Như tôi đã nói, hàm thực sự phức tạp hơn nghìn lần so với exmple. Tôi có thể sử dụng trình gỡ lỗi, nhưng tôi sẽ mất nhiều thời gian hơn nếu tôi có một công cụ như vậ[email protected] Nissenbaum – Shuo

+0

Nếu không có đầy đủ chi tiết thì thật khó để đưa ra một câu trả lời hay, nhưng trình gỡ lỗi không làm nhiều hơn là các điểm ngắt cơ bản và bước đơn. Bạn có thể sử dụng các điểm ngắt có điều kiện để theo dõi khi thực hiện kết thúc ở một nơi không mong muốn với một điều kiện trước nhất định. Ví dụ của bạn, điểm ngắt chỉ có thể kích hoạt trên một dải đầu vào nhất định. – JasonD

Trả lời

3

Từ khóa bạn đang tìm kiếm là "bảo hiểm mã" hoặc "phân tích mức độ phù hợp" hoặc "phân tích mức độ phù hợp mã".

Công cụ bạn sử dụng sẽ tự nhiên phụ thuộc vào phần còn lại của môi trường của bạn.

+0

Cảm ơn. Tôi cũng nhận thức được phạm vi mã nhưng tôi chưa thực sự sử dụng bất kỳ công cụ bảo vệ mã nào. Bạn có chia sẻ một công cụ đã được thử nghiệm và sử dụng thành công không? – Shuo

-1

Công cụ bạn muốn là printf hoặc std::cerr!

Và bạn có một lỗi đáng kể trong mã của mình: một tuyên bố như if (10000 < income < 30000) sẽ không hoạt động như mong đợi! Bạn muốn viết nó như if(10000 < income && income < 30000).

Và để giữ cho thử nghiệm đơn giản, hãy sử dụng dấu ngoặc nhọn như trong:

if(10000 < income && income < 30000) { 
    return levelOneTax(); 
} else if(... 

Bởi vì sau đó nó sẽ được dễ dàng hơn nhiều để thêm kết xuất debug, như trong:

if(10000 < income && income < 30000) { 
    std::cerr << "using levelOneTax for income=" << income << std::endl; 
    return levelOneTax(); 
} else if(... 

EDIT

BTW: "một công cụ so sánh đường dẫn thực hiện sẽ tiết lộ đủ thông tin [...]", NHƯNG theo nghĩa bạn mong đợi, một công cụ như vậy sẽ tiết lộ thông tin QUÁ NHIỀU để xử lý. Điều tốt nhất bạn có thể làm là gỡ lỗi và xác minh rằng mã của bạn đang làm những gì bạn mong đợi nó làm. Một công cụ "bao phủ mã" có lẽ sẽ quá lớn đối với trường hợp của bạn (và các công cụ này cũng không rẻ).

+0

Kiểu mã và độ chính xác ngữ pháp không phải là một mối quan tâm ở đây vì tôi chỉ sử dụng điều này làm ví dụ. – Shuo

+0

Có, nhưng cũng đọc chỉnh sửa của tôi .. – Frunsi

+0

printf và std: cerr là quá nhiều nỗ lực vì tôi có một cơ sở mã lớn như vậy và tôi không quen với chính mã đó. – Shuo