2012-12-09 19 views
6

Bazı girdiler altında bazı beklenmedik sonuçlar veren çok karmaşık bir C++ işlevi hata ayıklama yapıyorum. Kod bölümlerini farklı girdiler altında karşılaştırmak istiyorum, böylece hangi parçanın hataya neden olduğunu anlarım. Kod yürütme yollarını karşılaştırabilen aracı, aradığım şey. Böyle bir araç varsa lütfen bana bildirin. Ya da aynı şeyi yapmak için kullanabileceğim bazı teknikler varsa?Farklı girdiler altında aynı kod yürütme yollarını karşılaştırın

Sorunumu somut olarak açıklamak için, burada bir örnek oluşturuyorum.

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

Verilen girdi 15000, fonksiyon vergisi doğru miktarda hesaplar, ama nedense girdi 16000 hatalı vergi miktarını verir, bu pseudocode işlevi olduğunu varsayalım. Varsayılan olarak, 15000 ve 16000 girişleri, fonksiyonun tam olarak aynı yürütme yollarından geçmesine neden olur; Öte yandan, eğer farklı yollara giderlerse, o zaman fonksiyonda bir şeyler yanlış gitmiş olmalı. Bu nedenle, yürütme yollarını karşılaştıran bir araç, hatayı hızlı bir şekilde tanımlamama yardımcı olabilecek yeterli bilgiyi açığa çıkarır. Ben böyle bir araç arıyorum. Tercihen Visual Studio 2010 ile uyumludur. Böyle bir araç da değişken değerlerini koruyorsa daha iyi olur.

P.S. Hata ayıklama yapmak istediğim en son şeydir çünkü çalıştığım kod tabanı, önemsiz maaş örneğinden çok daha büyük ve karmaşıktır.

Lütfen

Yardım edin. Teşekkürler.

+0

Visual Studio 2010'unuz çalışıyor mu ve çalışıyor mu? Öyleyse, 'payTax()' işlevinin başlangıcında bir kesme noktası koymayı ve ardından programı hata ayıklayıcıda çalıştırmayı denediniz mi? –

+0

Evet. Söylediğim gibi, gerçek işlev, mahrumiyete uğramış eziyetten bin kat daha karmaşıktır. Hata ayıklayıcısını kullanabilirdim, ama böyle bir araçtan çok daha fazla zaman harcayacaktı[email protected] Nissenbaum – Shuo

+0

Tam ayrıntılara sahip olmak iyi bir cevap vermek zor olsa da, hata ayıklayıcı yalnızca temel kesme noktalarından ve tek adımdan daha fazlasını yapar. Yürütme, belirli bir ön koşulla beklenmedik bir yerde bittiğinde izlemek için koşullu kesme noktalarını kullanabilirsiniz. Örneğiniz için, kesme noktası sadece belirli bir girdi aralığında ateşleyebilir. – JasonD

cevap

3

Aradığınız anahtar kelimeler "kod kapsamı" veya "kapsama analizi" veya "kod kapsamı analizi" dir.

Kullandığınız araç, çevrenizin geri kalanına bağlı olacaktır.

+0

Teşekkürler. Kod kapsamı konusunda da bilgi sahibi oldum, ancak kendimi herhangi bir kod kapsamı aracı kullanmadım. Başarılı bir şekilde test edilmiş ve kullanılmış bir aracı paylaşır mısınız? – Shuo

-1

İstediğiniz araç printf veya std::cerr!

Ve kodunuzda önemli bir hata var: if (10000 < income < 30000) gibi bir ifade beklendiği gibi çalışmayacaktır! if(10000 < income && income < 30000) gibi yazmak istersiniz.

Ve basit test tutmak olduğu gibi süslü parantez kullanın:

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

çok daha kolay olacak Çünkü o zaman olduğu gibi, ayıklama çıktısını eklemek için:

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

DÜZENLEME

BTW: "yürütme yollarını karşılaştıran bir araç yeterli bilgiyi açığa çıkarır [...]", ANCAK beklediğiniz anlamda, böyle bir araç işlemek için ÇOK ÇOK bilgisini ortaya çıkaracaktı. Yapabileceğiniz en iyi şey, hata ayıklama ve kodunuzun yapmasını beklediğiniz şeyi yaptığının doğrulanmasıdır. Bir "kod kapsamı" aracı muhtemelen sizin durumunuz için çok büyük olacaktır (ve ayrıca bu araçlar ucuz değildir).

+0

Kod stili ve gramma doğruluğu, bunu bir örnek olarak kullandığımdan beri burada bir sorun değil. – Shuo

+0

Evet, ama aynı zamanda benim düzenlemek .. – Frunsi

+0

printf ve std: cerr çok fazla çabaya sahip çünkü çok büyük bir kod tabanım var ve kodun kendisiyle aşina değilim. – Shuo

İlgili konular