2012-12-09 12 views
6

Debuguję bardzo złożoną funkcję C++, która daje pewne nieoczekiwane wyniki pod niektórymi danymi wejściowymi. Chciałbym porównać wykonanie kodu pod różnymi danymi wejściowymi, aby dowiedzieć się, która część powoduje błąd. Potrzebne jest narzędzie , które umożliwia porównywanie ścieżek wykonywania kodu. Daj mi znać, jeśli takie narzędzie istnieje. Lub w inny sposób, jeśli istnieje kilka technik, które mogę zastosować, aby zrobić to samo?Porównaj ścieżki wykonywania tego samego kodu pod różnymi wejściami

Aby konkretnie opisać mój problem, tutaj używam przykładowego przykładu.

powiedzieć, jest to funkcja w pseudocode,

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(); 
} 

danego wejścia 15000, funkcja oblicza prawidłową kwotę podatku, ale jakoś wejście 16000 daje błędną kwotę podatku. Podobno dane wejściowe 15000 i 16000 spowodowałyby, że funkcja przechodzi dokładnie te same ścieżki wykonania; z drugiej strony, jeśli idą różnymi ścieżkami, coś musiało pójść nie tak w funkcji. Dlatego narzędzie porównujące ścieżki wykonania ujawniłoby wystarczająco dużo informacji, które mogłyby pomóc mi szybko zidentyfikować błąd. Szukam takiego narzędzia. Najlepiej kompatybilny z Visual Studio 2010. Byłoby lepiej, gdyby takie narzędzie zachowało wartości zmiennych.

P.S. debugowanie jest ostatnią rzeczą, którą chcę zrobić, ponieważ baza kodu, z którą pracuję jest znacznie większa i bardziej skomplikowana niż banalny przykład payTax.

Proszę o pomoc. Dzięki.

+0

Czy masz już uruchomione Visual Studio 2010? Jeśli tak, czy próbowałeś umieścić punkt przerwania na początku funkcji 'payTax()', a następnie uruchomiłeś program w debugerze? –

+0

Tak. Jak już powiedziałem, prawdziwa funkcja jest tysiąckrotnie bardziej złożona niż wymyślny przykład. Mógłbym używać debuggera, ale kosztowałoby mnie to o wiele więcej czasu, niż gdybym miał takie narzę[email protected] Nissenbaum – Shuo

+0

Bez szczegółowych informacji trudno jest podać dobrą odpowiedź, ale debugger robi więcej, niż tylko podstawowe punkty przerwania i pojedynczy krok. Do śledzenia można użyć warunkowych punktów przerwania, gdy wykonywanie zakończy się niespodziewanie z danym warunkiem wstępnym. Dla Twojego przykładu punkt przerwania mógł wystrzelić tylko na dany zakres danych wejściowych. – JasonD

Odpowiedz

3

Szukane słowa kluczowe to "zasięg kodu" lub "analiza pokrycia" lub "analiza zasięgu kodu".

Które z używanych narzędzi w naturalny sposób zależeć będzie od reszty środowiska.

+0

Dzięki. Byłem również świadomy zasięgu kodu, ale tak naprawdę nie używałem żadnego narzędzia do obsługi kodu. Czy chcesz udostępnić narzędzie, które zostało pomyślnie przetestowane i użyte? – Shuo

-1

Potrzebne narzędzie to printf lub std::cerr!

Masz poważny błąd w swoim kodzie: oświadczenie takie jak if (10000 < income < 30000) nie będzie działać zgodnie z oczekiwaniami! Chcesz napisać tak jak if(10000 < income && income < 30000). aby dodać wyjście debugowania, jak w

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

Bo wtedy będzie dużo łatwiej::

i utrzymać testowania proste, należy użyć nawiasów klamrowych jak w

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

EDIT

Przy okazji: "narzędzie porównujące ścieżki wykonania ujawniłoby wystarczającą ilość informacji [...]", ALE w tym sensie, że spodziewamy się, takie narzędzie ujawniłoby ZA DUŻO informacji do obsługi. Najlepszą rzeczą, jaką możesz zrobić, to debugowanie i weryfikowanie, czy twój kod wykonuje to, czego oczekujesz. "Pokrycie kodu" byłoby prawdopodobnie zbyt duże dla twojej sprawy (a także takie narzędzia nie są tanie).

+0

Styl kodu i poprawność grammy nie są tutaj problemem, ponieważ użyłem tego jako przykładu. – Shuo

+0

Tak, ale także przeczytaj moją edycję .. – Frunsi

+0

printf i std: cerr to za dużo wysiłku, ponieważ mam tak dużą bazę kodu i nie znam się na samym kodzie. – Shuo

Powiązane problemy