Kodunuzda istenmeyen hataları ortaya çıkarmak için GNU Hata Ayıklayıcı'yı nasıl kullanacağınızı öğrenerek kod kalitesini artırın ve beklenmedik sonuçları önleyin.
Hata ayıklama, programcılar ve güvenlik araştırmacıları için vazgeçilmez bir beceridir. Güçlü bir hata ayıklama anlayışına sahip olmak, daha düşük düzeydeki bir yürütülebilir dosyayı anlamanıza ve gizlenen hataları yakalamanıza olanak tanır.
GNU hata ayıklayıcı veya GDB, programcıların yıllardır güvendiği, zamansız bir hata ayıklama aracıdır. Linux'ta GDB'nin nasıl kullanılacağı aşağıda açıklanmıştır.
Örnek Programların Hazırlanması
GDB'nin özelliklerini keşfetmek için deneyebileceğiniz bir yürütülebilir dosyaya ihtiyacınız olacak. Gösterim amacıyla, GDB'yi bir kez kaynak kodu ve hata ayıklama simgeleri mevcut olacak şekilde, bir kez de bunlar olmadan bir anahtar kontrol programında çalıştıracaksınız. kaynak kodu ve mesajları ekrana yazdıran, hem C dilinde yazılmış hem de GCC (GNU C) ile derlenmiş basit, çok iş parçacıklı bir program üzerinde Derleyici).
Yapabilirsiniz başka bir C derleyicisini kullanın ancak ikili dosyayı çıkarmadığınızdan emin olun.
Büyük olasılıkla GDB'yi kendi programlarınızda çalıştıracaksınız. Bu yüzden bunları aşağıdakilerle derlediğinizden emin olun: -G hata ayıklama sembollerini etkinleştirmek için gcc ile işaretleyin.
Hata ayıklama sembolleri olmadan ve büyük ölçüde soyulmuş bir ikili dosyayla, programın sökülmesinde hata ayıklamanız gerekecektir. Bu, montaj dilini güçlü bir şekilde kavramanızı gerektirecektir. Linux'ta bellek ayırma nasıl çalışır? yığın ve kayıtlardaki verileri anlamak için.
GDB'de Program Çalıştırma
GDB'de bir programı birkaç şekilde çalıştırırsınız. Ya yazın gdb ve yüklendikten sonra şunu yazın: koşmak. Veya gdb'yi başlatın ve ardından dosya komutunu kullanın, ikili dosyayı gdb'ye yükleyin ve ardından onu çalıştırın. koşmak emretmek.
Programınızın düzgün çalışması için komut satırı bağımsız değişkenlerini gerektiriyorsa, bağımsız değişkenleri program adından sonra eklediğinizden emin olun. Programı GDB'ye yüklemek ve argümanlarla çalıştırmak için sözdizimi aşağıda verilmiştir:
gdb
run
Veya:
gdb
file
run
GDB ile Kesme Noktalarını Ayarlama
Hata ayıklamadaki kesme noktaları, program bir kesme noktasına ulaştığında yürütme akışını durduran kodda manuel olarak ayarlanan sabit duraklardır. Kesme noktalarını ayarlamak, kodda adım adım ilerlemenize ve yürütmenin her aşamasının verileri ve değişkenleri nasıl etkilediğini incelemenize olanak tanır.
GDB'de, hata ayıklama simgeleriyle bir programın hatalarını ayıklarken, işlevin adına göre bir kesme noktası ayarlayabilir veya satır numarasına göre bir kesme noktası ayarlayabilirsiniz. İşte sözdizimi:
break main
break 47
Geçerli hata ayıklama oturumundaki tüm kesme noktalarını görüntülemek için şunu yazın:
info breakpoints
Belirli bir kesme noktasını veya birden çok kesme noktasını silmek için şunu yazın:
delete 2
delete 3-5
GDB ayrıca koşullu kesme noktaları belirlemenize de olanak tanır; bu, programın yalnızca yürütme sırasında belirli bir koşulun karşılanması durumunda durma noktasına geleceği anlamına gelir. Bu, bir değişkenin değerindeki değişiklik veya başarısız işlev çağrısı veya istediğiniz herhangi bir şey olabilir. Koşullu kesme noktalarını ayarlamaya yönelik sözdizimi aşağıda verilmiştir:
break if n == 2
Bir kesme noktasına ulaştıktan sonra programın yürütülmesine devam etmek istiyorsanız, şunu yazın: devam etmek emretmek:
continue
Kodda Adım Atmak
Kodun adım adım ilerlemesi, programın verileri nasıl işlediğini anlamak açısından çok önemlidir. Programınızdaki çeşitli işlevlerde adım adım ilerleyerek ve verilerin durumunu inceleyerek, programın kodda yazdığınız mantığı nasıl uyguladığını daha iyi anlayabilirsiniz.
Ayrıca, çökmelerin kökenini tespit etmenize ve her kod satırında istediğiniz gibi ilerleyebildiğiniz için program davranışını cerrahi hassasiyetle incelemenize yardımcı olur. GDB'de kodda üç temel yolla adım adım ilerleyebilirsiniz:
- adım: Bu komut GDB'ye kaynak dosyanın bir sonraki satırına adım atmasını söyler. Bu, kaynak kodun uzunluğunu satır satır geçmenize olanak tanır.
- Sonraki: Bu komut, geçerli işlevin içindeki kaynak kodun bir sonraki satırını yürütür ve sonra durur. Sonraki bir işlevi tek bir satır olarak ele alır; bu nedenle, bir işlev çağrısından önce next komutunu kullanırsanız, onu tek bir satır olarak ele alır ve üzerinden geçer. adım emretmek.
- sona ermek: Bitir komutu, geçerli fonksiyonun içinde kalan tüm satırları çalıştırır ve sonra durur.
Değişkenlerin İncelenmesi
Kodda ilerledikçe, program mantığının onları nasıl değiştirdiğini görmek için değişkenlerin değerini incelemek istersiniz. GDB'deki değişkenlerin değerini görüntülemek için kullanılan sözdizimi şöyledir:
print
Bir değişkenin değerindeki değişiklikleri her güncellendiğinde yazdırmak istiyorsanız display komutunu kullanmalısınız. Bu, özellikle bir döngüdeki değişkenin değerini izlemek ve yazdırmak istediğinizde kullanışlıdır:
display
İzleme Noktalarını Ayarlama
İzleme noktaları ve koşullu kesme noktaları, her ikisi de programdaki değişikliklere yanıt verdiği için yakından ilişkilidir. İzleme noktaları, koddaki verilerdeki değişiklikleri izlemek için kullanılır. Örneğin, bir değişkenin değeri değiştiğinde programın kesilmesini isteyebilirsiniz. Bunu GDB ile nasıl yapacağınız aşağıda açıklanmıştır:
watch
GDB ile Konuya Özel Hata Ayıklama
GDB, çok iş parçacıklı programlarla çalışırken iş parçacığına özgü hata ayıklama yapmanızı sağlar. Gösterim amacıyla, her bir iş parçacığına mesaj yazdırmak için dört iş parçacığı kullanan basit bir C Programıyla çalışacağız.
Programınızda halihazırda oluşturulmuş konuları görüntülemek için, bilgi emretmek:
info threads
Belirli bir iş parçacığıyla çalışmak için onu dizin numarasını kullanarak listeden seçebilirsiniz. Örneğin:
thread 2
İş parçacığını seçtikten sonra, yürütme akışını kullanarak adım adım ilerleyebilirsiniz. adım, Sonraki, Ve sona ermek Yukarıda gösterildiği gibi komutlar.
GDB ile Uzaktan Hata Ayıklama
Ayrıca farklı bir sistemde bulunan programların hatalarını uzaktan da ayıklayabilirsiniz. Bunu yapmak için hedef makinede gdbserver kurmanız gerekir. Dağıtımınızın varsayılan paket yöneticisini kullanarak kolayca yükleyebilirsiniz veya yüklediğiniz diğer paket yöneticileri sisteminizde.
Örneğin, gdbserver'ı Ubuntu veya Debian tabanlı sistemlerinize kurmak için APT'yi kullanın:
sudo apt install gdbserver
Kurulduktan sonra ikili dosyanın klasörüne gidin ve gdbserver'ı başlatmak için şu komutu çalıştırın:
gdbserver :
gdbserver, açık olduğunu ve tanımladığınız bağlantı noktasını dinlediğini gösteren çıktıyı döndürmelidir. Şimdi istemci makinede GDB'yi başlatın ve ardından uzak sunucuya bağlanın. hedef emretmek:
target remote :
Hata Ayıklamayı Otomatikleştirmek için GDB Komut Dosyaları Yazma
GDB, programcıların GDB komutlarını otomatik olarak yürütecek GDB komut dosyaları yazmasına olanak tanır. Bu, bir kodun aynı bölümünde birden çok kez hata ayıklamaya çalıştığınızda çok yardımcı olur. İkili dosyayı her yüklediğinizde kesme noktasını ayarlamak, kodda adım adım ilerlemek ve değişken değerlerini yazdırmak yerine, tüm süreci otomatikleştirmek için bir GDB komut dosyası kullanabilirsiniz.
İşte bir örnek:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
Yukarıdaki komut dosyasında, GDB'ye günlüğe kaydetmeyi etkinleştirmesini ve günlüğü adlı bir dosyaya kaydetmesini söylüyorsunuz. örnek çıkışardından bir kesme noktası belirleyin. ana işlev.
1 numaralı kesme noktası için, bu durumda main fonksiyonundaki kesme noktası için aşağıdaki komutları çalıştırın: geriye doğru izleme, Yazdır, devam etmek. Temel olarak, GDB önce bir geri izleme çalıştıracak, ardından "N" değişkeninin değerini yazdıracak, yürütmeye devam edecek ve son olarak çıkacaktır.
Bu betiği çalıştırmak için şunu kullanın:
gdb -x