Hata ayıklama kodu yerinde mi kalmalı, her zaman mı yoksa sadece hata bulunduğunda hata ayıklama ve kaldırma sırasında mı eklenmeli?


35

Birincisi, bir hata bulmaya çalışırken hata ayıklama kodu (örneğin print ifadeleri gibi) ekliyorum. Ve bir kere bulduktan sonra, hata ayıklama kodunu kaldırdım (ve özellikle bu hatayı test eden bir test durumu ekle). Bunun gerçek kodu bozduğunu ve bu nedenle hata ayıklamadığım sürece orada bir yer olmadığını hissediyorum.

Bunu nasıl yapıyorsun? Hata ayıklama kodunu yerinde mi bırakıyorsunuz veya eskiyse kaldırıyor musunuz (hangisi olduğu zaman karar vermek zor olabilir)?

Yanıtlar:


30

Hata ayıklama yazdırma ifadeleri çıkarılmalıdır; Bununla birlikte, bir üretim probleminde hata ayıklamak için onları eklemeniz gerekiyorsa, o zaman günlük çerçevenize koymak için yeterli bilginiz olup olmadığını düşünmeniz faydalı olabilir. Parametreler, hata koşulları vb. İle ilgili bilgiler, bir sonraki hatanın ortaya çıkması üzerine daha sonra faydalı olabilir. Dinamik olarak açılmış hata ayıklama veya izleme günlüğü iletilerinin olabileceği iyi bir günlük kaydı çerçevesini kullanmak vahşi ortamda çok yararlı olabilir.


5
+1 Öncelikle, yerinde mantıklı bir hata ayıklama çerçevesine sahip olduğundan bahsettiğin için. Bu başlangıçta yerinde ise ve çeşitli hata ayıklama seviyeleri varsa, üretim kodu, pahalı hata ayıklama rutinleri çağırılmadan çalıştırılabilir ve geliştirme kodu, istenen düzeyde ne olursa olsun, istenen şekilde giriş yapılırsa, geliştirme kodu çalıştırılabilir.
Ocak'ta

1
Orbling ile aynı fikirde. Ayrıca, yalnızca performans etkisi olan veya üretim için uygun olmayan başka bir neden olan yalnızca bilgi ekranı dışındaki hata ayıklama kodu için. (örneğin, fonksiyonun sonucuna dair bir Assert, örneğin bir sıralama sonucunu kontrol etme), iki yapım hedefi hedefini düşünebilirsiniz. hata ayıklama modu ve serbest bırakma modu.
Zekta Chan

16

Özellikle hata ayıklama için eklenen kod, üretim yazılımından kaldırılmalıdır.

Bunun tamamen kaldırılması veya koşullu derleme bölümlerine konulması (C / C ++ / C # 'da olduğu gibi) size ve kodlama standardınıza bağlıdır.

Bunun birkaç nedeni var:

  1. Bu kod yürütülürse veya birisinin çıktısına erişebiliyorsa, güvenlik etkileri olabilir.
  2. Uygulamayı yavaşlatabilir.
  3. Diğer geliştiricilerin, hatta 6 ay boyunca koda (veya gerçekten de kendinize) bakması kafa karıştırıcı olabilir.

Koşullu derleme için +1, ancak yorum blokları, bunları desteklemeyen dillerde çalışacaktır. Hiçbir zaman derlenmiş bir sürümde derlemeden çıkarmamalısınız, ancak bazen bir sürüm oluşturma işlemini bırakmak istediğinizde tamamen silmeyi sürdürmek aşırı derecede verimsizdir.
Bill

1
C / C ++ kodunun her zaman hata ayıklama seçenekleriyle derlendiği, üretim kodunun hata ayıklanması veya bir ortak kodun incelenmesi gerektiği durumlarda çalıştım. Bazen bu her zaman hata ayıklama yetkisine hazırdır, hata ayıklama ifadelerinin içinde bırakılması gerekir, böylece kodu yeniden derlemeden bir bayrakla açılabilirler. Java, JVM seçenekleriniz ayarlanmışsa hata ayıklamaya izin verir; bu nedenle daha sonra hata ayıklamak için nispeten daha az hazırlık çalışması gerekir.
Michael Shopsin

16

ChrisF ve Alaric'in her ikisinin de geçerli noktaları var; Onlar için +1. Kullandığım en az 5 farklı hata ayıklama kodu türünü tanımlayabilirim.

  1. Belirli bir zamanda sistem durumuna dökmek için günlükleri kullanma.

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. Yürütme kontrol noktaları için günlükleri kullanma.

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. Gerçekte belirli bir koşulu doğru olmaya zorlayan, ancak normal davranışı bozan kod. Örnek:

    • Bir hatayla ilgili bazı günlükleriniz olduğunu varsayalım, ancak sorunu yeniden oluşturamazsınız. Bazı değişkenleri günlükteki bilgilerle eşleşen bazı değerlere sahip olmaya zorlayan kod yazmayı deneyebilirsiniz.
  4. Doğrulama kaydı - Bunu, örneğin bir algoritmanın bireysel adımlarını doğrulamak gibi, üretimde yer almaması gereken yazılımın doğruluğunu doğrulamak için kullanılabilecek ayrıntılı bir kayıt olarak sınıflandırırdım.

  5. İşlem günlüğü - Alaric'in postasına bakınız . "İşlem günlüğü" ile neyi kastediyorum.

1, 2 ve 3 tamamen çıkmalı. 4 gibi bir şey muhtemelen şartlı olarak kodun dışında derlerdim. 5 için Alaric , günlükleri dinamik olarak kapatabilmek konusunda çok önemli bir noktaya değindi . Bu, çoğu durumda ChrisF'in ikinci kurşunundaki noktayı ele alabilir .


1
Bu iyi bir özet. Ancak, 1)… ile 1.… (böylece Markdown biçimlendirmesi bir liste olarak alır) ve örnek kodu 8 boşluk ile girerek düzgün bir şekilde biçimlendirirseniz daha iyi olur. bir listedeki kodu).
Konrad Rudolph

@Konrad Rudolph: Yapıldı.
gablin

3

Kodun ne yaptığına bağlı. Hata ayıklama için kullanılan bazı kodlar olduğu gibi bırakılabilir ve bazılarının kaldırılması gerekir.

Bir yöntemde parametrelerin uygunluğunu doğrulayan kod, kod düzgün çalıştığında her zaman kullanışlı değildir, ancak genellikle kodun doğru çalışmaya devam ettiğinden emin olmak için saklanır.

Bazen kodda hata ayıklamayı kolaylaştırmak için farklı bir kod yazarsınız, örneğin bir değeri hesaplamak ve yerel bir değişkene koymak ve ardından bir sonraki satırda değişkeni kullanmak; kod aracılığıyla. Hesaplanan değeri doğrudan kullanmak için kodu yeniden yazabilirsiniz, ancak yerel değişkeni kullanmanın maliyeti o kadar küçüktür (eğer varsa), kodu yeniden yazmak için çok az neden vardır. Ayrıca, bir kez test ettikten sonra kodu değiştirmeden bırakmanın bir anlamı vardır, değiştirirken her zaman bir hataya neden olma riski her zaman küçüktür.

Yalnızca belirli bir hatayı bulmak için eklediğiniz kod, hatayı bulduktan sonra genellikle kaldırılabilir.


2

Bir zamanlar çok fazla hata ayıklama kodu kullanırdım. Neredeyse tamamen Windows’u hedefliyordum, bu yüzden daha fazla hecelemeyi hatırlayamadığım çok sayıda hata ayıklama dizgisi çıktı işlevi vardı, bu yüzden izlemeyi belirli bir programla yakalayabiliyordum.

Bazı hata ayıklama kodları, aramaların iç içe geçmesi için tasarlanan belirli şeyler yerinde kaldı. Ancak, hata ayıklama dizisi olayı çoğunlukla bir üretim sisteminde görünmez olsa da, tümü hala koşullu derleme altında yapıldı.

Gerçek şu ki, tüm bu hata ayıklama kodunun, ideal olarak farklı bir yolla ele alınan bir şey için çok çaba gösterdiği, elbette bir hata ayıklayıcı kullanarak. O zamanlar, Borland C ++ hata ayıklayıcısından o kadar etkilenmedim. Araçlar oradaydı, ancak çok sık sık yanıltıcı sonuçlar verdiler ve IDE olmayan hata ayıklayıcısını kullanmak (genellikle gerekli) kısayol tuşlarını ezberlemek anlamına geliyordu;

Daha kötü bulduğum tek hata ayıklama deneyimi GDB komut satırı.

Her gün kullandığınız araçlarda uzman olmak elbette önemlidir - ancak hata ayıklama gerçekten her gün yaptığınız bir şey olmamalıdır. Hata ayıklayıcısını çok sık kullanırsanız düzinelerce komut ve / veya klavye kısayolu öğrenmekte sorun yok, bu bana biraz kırmızı bayrak gibi geliyor.

Visual Studio 7'de çalıştığım zaman hata ayıklamanın çok pratik ve etkili olabileceği açıktı. Hata ayıklama işleminizi Visual Studio'da yapabiliyorsanız (dahil hızlı sürümleri), hata ayıklama çok kolaydır. Hiç şüphesiz doğru GUI / IDE ön ucunu bulabilirseniz, GDB de kolay ve etkilidir, ancak henüz bu aramayı yapmadım.

Birim testi için söylenecek bir şey var, gcov kullanarak kapsama analizi. Kütüphanelerinizin davranışında olduğunuzdan emin olduğunuzda, hata ayıklama işleminiz ne kadar derin olursa olsun - ve hata ayıklayıcısını en başta ne kadar sık ​​ihtiyaç duyarsanız. Birim testleri yazmak, çoğu gün yapmanız gereken oldukça makul bir şeydir.

Beklenmedik şekilde önemli bir araç = cmake, diğer şeylerin yanı sıra GCC ve VC ++ için bina arasında kolayca geçiş yapmamı sağlayan bir oluşturma aracı. Böylece birim test ve gcov tabanlı kapsama alanımı GCC kullanarak yapabilirim, ancak hata ayıklayıcıyı kullanmak için kolayca VC ++ 'ya geçiş yapabilirim.


Çok iş parçacıklı uygulamalarda tehlikeli değilse, bir hata ayıklayıcı oldukça işe yaramaz, ancak kırmızı bayrak-ish yorumunuzu beğeniyorum.
Pemdas

@Pemdas - Bu satırlar boyunca ciddi bir sorun yaşamadım, ancak çoklu iş parçacığı açıkça hata ayıklayıcı dostu değil. Buna rağmen, doğru araçların muhtemelen hata ayıklama kodundan daha iyi bir çözüm olduğunu düşünüyorum. Yarış koşullarını, kilitlenmeleri, iki iş parçacığının aynı bellek / kaynak üzerinde aynı anda savaşabileceği durumları görebilen statik bir analiz aracı iyi olacaktır. Bu satırlar boyunca nelerin mevcut olduğu hakkında hiçbir fikrim yok, ancak bazı akıllı araçlar olduğunu biliyorum. Örneğin, klee, anlamıyorum ama temel açıklama çok etkileyici geliyor.
Steve314

“Bence doğru araçlar büyük olasılıkla prensip olarak hata ayıklama kodundan daha iyi bir çözüm” diyor. Analizin bir kısmını hazırlayan araçlara sahip olmak güzel olabilir, ancak özellikle yeni olanların, 100'ün% 15'inin ne olduğunu bulmak için hesap makinesi kullanması gereken biri gibi araçlara bağımlı olmaya başlayacağından endişe ediyorum.
Pemdas

Araştırma yapamadığım araçlara çok bağımlı olmak henüz pek mümkün görünmüyor. Hesaplama örneğinizde, evet, ancak kendi basit elektronik tablomu yazmak yerine OpenOffice Calc kullanacağım. Hata ayıklama kodu için bir zaman var (bir hata ayıklayıcıyla bile - örneğin kendi tuhaf koşul yaratma durumunuz), ancak belirli bir noktadan öteye giderse, mevcut araçlar kazanır. Ve 115'ten% 15'ini çıkarmak söz konusu olduğunda, bu hesap makinesini de kullanacağım - bariz bir cevap (100) olarak verilen çok sayıda insanın vereceği hata. Çok iş parçacıklı olarak, açıkçası doğru cevaplar bazen yanlış olduğu ortaya çıktığı için rezildir.
Steve314

1

Benim üstesinden geldim: Hata ayıklama kodu, söz konusu kodun içindeki bir hatayı öldürmek için kullanılır. Genelde tamamen kaldırırım. Hata ayıklama kodu, dış kuvvetlerden kaynaklanan bir hatayı öldürmek için kullanılır, ben genellikle yorum yaparım.


-1

Hata ünite testinden veya dahili ise, hata ayıklama kodu tamamen kaldırılabilir. Ancak hata üretimden geliyorsa, hata ayıklama kodu derleme etiketlerinin içinde daha iyi olur. Derleme etiketlerinin içine koymak, diğer geliştiricilerin bu kodun yalnızca hata ayıklama amacıyla olduğunu anlamalarına yardımcı olacaktır.


-1

TDD'yi kullanın , böylece test kodunuz daima korunduğu bir yere sahiptir.


Bu soruyu soruyu nasıl cevaplıyor?
gnat

Çünkü TDD sizi "hata ayıklamaya" ya da kaldırmak zorunda olmadığınız bir sınama koduna yönlendirir.
dukeofgaming,

Üzgünüm takip etmiyorum Bu nasıl?
gnat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.