GDB - Hızlı Kılavuz

Hata ayıklayıcı, diğer programları çalıştıran, kullanıcının bu programlar üzerinde kontrol sahibi olmasına ve sorunlar ortaya çıktığında değişkenleri incelemesine izin veren bir programdır.

GNU Hata Ayıklayıcısı, aynı zamanda gdb, UNIX sistemlerinde C ve C ++ programlarında hata ayıklamak için en popüler hata ayıklayıcıdır.

GNU Debugger, aşağıdakiler hakkında bilgi almanıza yardımcı olur:

  • Bir çekirdek dökümü gerçekleştiyse, program hangi ifade veya ifade üzerine çöktü?

  • Bir işlevi yürütürken bir hata oluşursa, programın hangi satırında bu işlev çağrısı bulunur ve parametreler nelerdir?

  • Programın yürütülmesi sırasında belirli bir noktada program değişkenlerinin değerleri nelerdir?

  • Bir programdaki belirli bir ifadenin sonucu nedir?

GDB Hata Ayıklama Nasıl Yapılır?

GDB, programı belirli bir noktaya kadar çalıştırmanıza, ardından durdurmanıza ve bu noktada belirli değişkenlerin değerlerini yazdırmanıza veya programda her seferinde bir satır ilerlemenize ve her satırı çalıştırdıktan sonra her değişkenin değerlerini yazdırmanıza olanak tanır.

GDB, basit bir komut satırı arayüzü kullanır.

Dikkat Edilmesi Gereken Noktalar

  • GDB bellek sızıntısı ile ilgili hataları bulmanıza yardımcı olsa da bellek sızıntılarını tespit etmek için bir araç değildir.

  • GDB, hatalarla derleyen programlar için kullanılamaz ve bu hataları düzeltmeye yardımcı olmaz.

Kuruluma gitmeden önce, aşağıdaki komutu vererek Unix sisteminizde zaten gdb'nin kurulu olup olmadığını kontrol edin:

$gdb -help

GDB kuruluysa, GDB'nizdeki tüm mevcut seçenekleri gösterecektir. GDB kurulu değilse, yeni bir kurulum için ilerleyin.

Aşağıda tartışılan basit adımları izleyerek GDB'yi sisteminize kurabilirsiniz.

step 1: Gdb'yi yüklemek için ön koşullara sahip olduğunuzdan emin olun:

  • ANSI uyumlu bir C derleyicisi (gcc önerilir - gdb'nin diğer derleyiciler tarafından oluşturulan kodlarda hata ayıklayabileceğini unutmayın)

  • Gdb'yi oluşturacağınız bölümde 115 MB boş disk alanı gereklidir.

  • Gdb'yi kuracağınız bölümde 20 MB boş disk alanı gereklidir.

  • GNU'nun dekompresyon programı, gzip

  • make yardımcı program - GNU sürümünün sorunsuz çalıştığı bilinmektedir, muhtemelen diğerleri de yapar.

step 2: Gdb kaynak dağıtımını şuradan indirin: ftp.gnu.org/gnu/gdb. (Kullandığımız gdb-6.6.tar.gz Bu talimatlar için.) Dağıtım dosyalarını inşa dizininize yerleştirin.

step 3:Derleme dizininizde, gdb-6.6.tar.gz dosyasını açın ve arşivden kaynak dosyaları çıkartın. Dosyaların ayıklanması bittiğinde, çalışma dizininizi, yapı dizininizde otomatik olarak oluşturulan gdb-6.6 dizinine değiştirin.

$ build> gzip -d gdb-6.6.tar.gz 
$ build> tar xfv gdb-6.6.tar 
$ build> cd gdb-6.6

step 4: Platformunuzun kaynak ağacını yapılandırmak için configure betiğini çalıştırın.

$ gdb-6.6> .⁄configure

step 5: Gdb'yi kullanarak make Yarar.

$ gdb-6.6> make

step 6: Kök olarak oturum açın ve aşağıdaki komutu kullanarak gdb'yi kurun.

$ gdb-6.6> make install

step 7: Gerekirse, kurulum tamamlandıktan sonra gdb yapı dizini ve arşiv dosyası silinerek disk alanı geri kazanılabilir.

$ gdb-6.6> cd .. 
$ build> rm -r gdb-6.6 
$ build> rm gdb-6.6.tar

Artık sisteminizde gdb yüklü ve kullanıma hazır.

Bir Debugging Symbol Tablederlenmiş ikili programdaki talimatları, kaynak kodundaki karşılık gelen değişken, işlev veya satırla eşler. Bu eşleme şöyle bir şey olabilir:

  • Program talimatı ⇒ öğe adı, öğe türü, orijinal dosya, tanımlanan satır numarası.

Sembol tabloları programa yerleştirilebilir veya ayrı bir dosya olarak saklanabilir. Bu nedenle, programınızda hata ayıklamayı planlıyorsanız, programda hata ayıklamak için gerekli bilgileri içeren bir sembol tablosu oluşturmanız gerekir.

Sembol tabloları hakkında aşağıdaki gerçekleri çıkarabiliriz:

  • Bir sembol tablosu, programın belirli bir sürümü için çalışır - program değişirse, yeni bir tablo oluşturulmalıdır.

  • Hata ayıklama derlemeleri genellikle perakende (hata ayıklama olmayan) derlemelerden daha büyük ve yavaştır; hata ayıklama yapıları, sembol tablosunu ve diğer yardımcı bilgileri içerir.

  • Kendi kendinize derlemediğiniz bir ikili programda hata ayıklamak isterseniz, yazardan sembol tablolarını almanız gerekir.

GDB'nin tüm bu bilgileri sembol tablosundan satır satır okuyabilmesi için, onu biraz farklı bir şekilde derlememiz gerekir. Normalde programlarımızı şu şekilde derleriz:

gcc hello.cc -o hello

Bunu yapmak yerine, aşağıda gösterildiği gibi -g bayrağıyla derlememiz gerekiyor:

gcc -g hello.cc -o hello

GDB geniş bir komut listesi sunar, ancak aşağıdaki komutlar en sık kullanılanlardır:

  • b main - Programın başına bir kesme noktası koyar

  • b - Mevcut satıra bir kesme noktası koyar

  • b N - N satırına bir kesme noktası koyar

  • b +N - Geçerli satırdan aşağıya bir kesme noktası N satırı koyar

  • b fn - "fn" işlevinin başına bir kesme noktası koyar

  • d N - N kesme noktası numarasını siler

  • info break - kesme noktalarını listeleyin

  • r - Programı bir kesme noktasına veya hataya kadar çalıştırır

  • c - Programı bir sonraki kesme noktasına veya hataya kadar çalıştırmaya devam eder

  • f - Mevcut işlev bitene kadar çalışır

  • s - Programın sonraki satırını çalıştırır

  • s N - Programın sonraki N satırını çalıştırır

  • n - s gibi, ancak işlevlere girmiyor

  • u N - Mevcut satırın önüne N satır gelene kadar çalışır

  • p var - "var" değişkeninin mevcut değerini yazdırır

  • bt - Bir yığın izi yazdırır

  • u - Yığın içinde bir seviye yukarı çıkar

  • d - Yığın içinde bir seviye aşağı iner

  • q - gdb'den çıkar

Başlarken: Başlatma ve Durdurma

  • gcc -g myprogram.c

    • Myprogram.c dosyasını hata ayıklama seçeneği (-g) ile derler. Hala bir a.out alırsınız, ancak ham bellek konumları (eğlenceli değil) yerine GDB içindeki değişkenleri ve işlev adlarını kullanmanıza izin veren hata ayıklama bilgilerini içerir.

  • gdb a.out

    • GDB'yi a.out dosyasıyla açar, ancak programı çalıştırmaz. Bir komut istemi (gdb) göreceksiniz - tüm örnekler bu komut istemindendir.

  • r

  • r arg1 arg2

  • r <dosya1

    • Önceden yüklenmiş "a.out" çalıştırmanın üç yolu. Doğrudan çalıştırabilir (r), argümanlar iletebilir (r arg1 arg2) veya bir dosyada besleyebilirsiniz. Genellikle çalıştırmadan önce kesme noktaları belirlersiniz.

  • help

  • h kesme noktaları

    • Yardım konularını listeler (yardım) veya belirli bir konuda yardım alır (h kesme noktaları). GDB iyi belgelenmiştir.

  • q - GDB'den çık

Kodda Adım Adım

Stepping, programınızın yolunu izlemenize ve çökmekte olan veya geçersiz girdi döndüren kodu sıfırlamanıza izin verir.

  • l

  • l 50

  • işlevim

    • Geçerli satır (l), belirli bir satır (l 50) veya bir işlev (işlev) için 10 satır kaynak kodu listeler.

  • Sonraki

    • Programı bir sonraki satıra kadar çalıştırır, ardından duraklatır. Mevcut satır bir işlevse, tüm işlevi yürütür ve sonra duraklar.next kodunuzda hızlıca gezinmek için iyidir.

  • adım

    • Bir sonraki talimatı çalıştırır, satırı değil. Mevcut talimat bir değişken ayarlıyorsa, aynıdırnext. Bu bir işlevse, işleve atlar, ilk ifadeyi yürütür ve sonra durur.step kodunuzun ayrıntılarına dalmak için iyidir.

  • bitiş

    • Mevcut işlevi yürütmeyi bitirir, ardından duraklatır (dışarı çıkma da denir). Yanlışlıkla bir işleve girdiyseniz kullanışlıdır.

Kesme Noktaları veya İzleme Noktaları

Kesme noktaları, hata ayıklamada önemli bir rol oynar. Belirli bir noktaya ulaştığında bir programı duraklatırlar (bozarlar). Değişkenleri inceleyip değiştirebilir ve yürütmeye devam edebilirsiniz. Bu, bazı giriş hataları meydana geldiğinde veya girişler test edilecek olduğunda faydalıdır.

  • kırılma 45

  • fonksiyonumu boz

    • 45. satırda veya işlevimde bir kesme noktası ayarlar. Kesme noktasına ulaştığında program duraklayacaktır.
  • x == 3 izle

    • Bir koşul değiştiğinde (x == 3 değiştiğinde) programı duraklatan bir izleme noktası ayarlar. İzleme noktaları, her işlev çağrısında kırılmak zorunda kalmadan belirli girdiler (myPtr! = NULL) için harikadır .

  • devam et

    • Bir kesme noktası / izleme noktası tarafından duraklatıldıktan sonra yürütmeyi sürdürür. Program, bir sonraki kesme noktasına / izleme noktasına ulaşana kadar devam edecektir.

  • N sil

    • N kesme noktasını siler (kesme noktaları, oluşturulduğunda numaralandırılır).

Değişkenleri Ayarlama

Değişkenleri çalışma zamanında görüntülemek ve değiştirmek, hata ayıklamanın kritik bir parçasıdır. Sorunların temel nedenini bulmak için işlevlere geçersiz girdiler sağlamayı veya başka test senaryoları çalıştırmayı deneyin. Tipik olarak, program duraklatıldığında değişkenleri görüntüler / ayarlarsınız.

  • x yazdır

    • X değişkeninin mevcut değerini yazdırır. Orijinal değişken isimlerini kullanabilmek (-g) bayrağına neden ihtiyaç duyulduğudur; düzenli olarak derlenen programlar bu bilgileri kaldırır.

  • x = 3 olarak ayarlayın

  • x = y olarak ayarla

    • X'i bir set değerine (3) veya başka bir değişkene (y) ayarlar
  • işlevimi çağır ()

  • myotherfunction (x) çağır

  • strlen'i ara (mystring)

    • Kullanıcı tanımlı veya sistem işlevlerini çağırır. Bu son derece kullanışlıdır, ancak buggy işlevlerini çağırmaya dikkat edin.

  • ekran x

    • Her adımdan veya duraklamadan sonra gösterilen x değişkeninin değerini sürekli olarak görüntüler. Sürekli olarak belirli bir değeri kontrol ediyorsanız kullanışlıdır.

  • gösterilmeyen x

    • Display komutu tarafından görüntülenen bir değişkenin sabit görüntüsünü kaldırır.

Geri İzleme ve Çerçeveleri Değiştirme

Yığın, geçerli işlev çağrılarının bir listesidir - size programda nerede olduğunuzu gösterir. Bir çerçeve gibi bağımsız değişken olarak tek bir işlev çağrısı detaylarını saklar.

  • bt

    • Backtracesveya geçerli programda nerede olduğunuzu göstermek için geçerli işlev yığınını yazdırır. Ana çağrılar, c () çağrısı yapan b () işlevini çağıran a () işlevi ise, geri izleme

  • c <= current location 
    b 
    a 
    main
  • up

  • aşağı

    • İşlev yığınında bir sonraki kareye yukarı veya aşağı gitme. Eğer içindeysenc, taşınabilirsin b veya a yerel değişkenleri incelemek için.

  • dönüş

    • Geçerli işlevden döner.

Sinyalleri Yönetme

Sinyaller, zamanlayıcı veya hata gibi belirli olaylardan sonra atılan mesajlardır. GDB bir sinyalle karşılaştığında duraklayabilir; bunun yerine onları görmezden gelmek isteyebilirsiniz.

  • tutamaç [işaret adı] [eylem]

  • SIGUSR1 nostop işlemek

  • SIGUSR1 noprint işlemek

  • işle SIGUSR1 yoksay

    • GDB'ye belirli bir sinyali (SIGUSR1) oluştuğunda göz ardı etmesini söyleyin. Farklı seviyelerde görmezden gelme vardır.

Bir programda hata ayıklama prosedürünü ve dökülen çekirdeği anlamak için aşağıdaki örnekleri gözden geçirin.

  • Hata Ayıklama Örneği 1

    Bu örnek, sıfıra bölünürken ortaya çıkan bir istisna nedeniyle meydana gelen bir hatayı nasıl yakalayacağınızı gösterir.

  • Hata Ayıklama Örneği 2

    Bu örnek, başlatılmamış bellek nedeniyle bir çekirdeği dökebilen bir programı gösterir.

Her iki program da C ++ ile yazılmıştır ve farklı nedenlerden dolayı çekirdek dökümü oluşturur. Bu iki örneği inceledikten sonra, çekirdek dökümler oluşturan C veya C ++ programlarınızda hata ayıklama konumunda olmalısınız.

Bu öğreticinin üzerinden geçtikten sonra, GNU Debugger kullanarak bir C veya C ++ programında hata ayıklama konusunda iyi bir anlayış kazanmış olmalısınız. Şimdi diğer hata ayıklayıcıların işlevselliğini öğrenmek sizin için çok kolay olmalı çünkü GDB'ye çok benziyorlar. Özelliklerine aşina olmak için diğer hata ayıklayıcılardan da geçmeniz şiddetle tavsiye edilir.

Piyasada epeyce iyi hata ayıklayıcı bulunmaktadır:

  • DBX Debugger- Bu hata ayıklayıcı, Sun Solaris ile birlikte gönderilir ve dbx'in man sayfasını, yani man dbx'i kullanarak bu hata ayıklayıcı hakkında tam bilgi edinebilirsiniz .

  • DDD Debugger- Bu, dbx'in grafiksel bir sürümüdür ve Linux'ta ücretsiz olarak kullanılabilir. Tam bir ayrıntıya sahip olmak için, ddd'nin man sayfasını kullanın, yani man ddd .

Aşağıdaki bağlantıdan GNU Debugger hakkında kapsamlı bir ayrıntı edinebilirsiniz: GDB ile Hata Ayıklama