2012-12-09 2 views
6

일부 입력에서 예상치 못한 결과를 나타내는 매우 복잡한 C++ 함수를 디버깅하고 있습니다. 다른 부분에서 코드 실행을 비교하여 어떤 부분에서 버그가 발생하는지 알아 보려고합니다. 코드 실행 경로를 비교할 수있는 도구는 내가 찾고있는 도구입니다. 그런 도구가 있는지 알려주세요. 아니면 같은 일을하기 위해 사용할 수있는 기술이 있다면?다른 입력에서 같은 코드의 실행 경로를 비교하십시오.

제 문제를 구체적으로 설명하려면 여기에 인위적인 예를 사용하고 있습니다.

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

주어진 입력 15000 함수 세금의 정확한 양을 계산하지만 어떻게 든 입력 16000은 잘못된 세액을 제공이 의사 펑션 말한다. 아마도 입력 15000과 16000은 함수가 정확하게 동일한 실행 경로를 통과하게합니다. 다른 한편으로는, 그들이 다른 길을가는 경우에, 무언가는 기능 안에 잘못 갔음에 틀림 없다. 따라서 실행 경로를 비교하는 도구를 사용하면 버그를 빨리 식별하는 데 도움이되는 정보를 얻을 수 있습니다. 나는 그런 도구를 찾고있다. Visual Studio 2010과 호환되는 것이 좋습니다. 이러한 도구에서도 변수 값을 유지하는 것이 좋습니다.

P. 디버깅은 제가하고 싶은 코드베이스가 사소한 payTax 예제보다 훨씬 크고 복잡하기 때문에 제가하고 싶은 마지막 일입니다.

도와주세요. 감사.

+0

Visual Studio 2010이 설치되어 실행 중입니까? 그렇다면'payTax()'함수의 시작 부분에 중단 점을 놓은 다음 디버거에서 프로그램을 실행 해 보았습니까? –

+0

예. 제가 말했듯이, 실제 기능은 고작 인 exmple보다 수천 배 더 복잡합니다. 디버거를 사용할 수는 있지만 그런 도구가있는 것보다 훨씬 많은 시간을 들여야합니다[email protected] Nissenbaum – Shuo

+0

좋은 세부 정보가 없으면 좋은 답변을 제공하는 것이 까다 롭지 만 디버거는 단순한 기본 중단 점 및 단일 단계 이상의 기능을 수행합니다. 조건부 중단 점을 사용하여 주어진 사전 조건으로 실행이 예상치 못한 곳에서 끝날 때 추적 할 수 있습니다. 예를 들어, 브레이크 포인트는 주어진 입력 범위에서만 발생합니다. – JasonD

답변

3

찾고있는 키워드는 "코드 범위"또는 "범위 분석"또는 "코드 범위 분석"입니다.

당신이 사용하는 도구는 자연스럽게 나머지 환경에 따라 달라집니다.

+0

감사합니다. 코드 커버리지에 대해서도 알고 있었지만 코드 커버리지 도구를 직접 사용하지는 않았습니다. 성공적으로 테스트 및 사용 된 도구를 공유해도 되겠습니까? – Shuo

-1

원하는 공구는 printf 또는 std::cerr입니다!

코드에 많은 오류가 있습니다. if (10000 < income < 30000)과 같은 문구가 예상대로 작동하지 않습니다! if(10000 < income && income < 30000)과 같이 쓰고 싶습니다.

그리고 간단한 테스트를 유지하기에서와 같이 중괄호를 사용하십시오 :

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

을 훨씬 쉽게 될 것입니다 다음 때문에 같이 디버그 출력을 추가 :

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

편집

BTW : "실행 경로를 비교하는 도구는 충분한 정보를 나타낼 수 있지만 [...]"하지만 예상하고있는 의미에서 이러한 도구 처리 할 정보가 너무 많습니다. 당신이 할 수있는 최선의 일은 당신의 코드가 당신이 기대하는 바를하고 있는지를 디버깅하고 검증하는 것입니다. "코드 적용 범위"도구는 아마도 귀하의 경우에 너무 커질 수 있습니다 (또한 이러한 도구는 저렴하지 않습니다).

+0

코드 스타일과 그램 정확도는 여기에서 예제로 사용 했으므로 여기서는 문제가되지 않습니다. – Shuo

+0

네,하지만 제 편집을 읽으십시오 .. – Frunsi

+0

printf와 std : cerr은 너무 큰 노력을 기울이고 있습니다. 왜냐하면 커다란 코드베이스를 가지고 있고 코드 자체에 익숙하지 않기 때문입니다. – Shuo

관련 문제