GNU Hata Ayıklayıcı

GNU Hata Ayıklayıcı Gdb-7.3-debugging-session.png görüntüsünün açıklaması. Bilgi
Tarafından geliştirildi GNU Projesi
İlk versiyon 1986
Son sürüm 10.2 (25 Nisan 2021)
Depozito sourceware.org/git/gitweb.cgi?p=binutils-gdb.git
Yazılmış C ve Şema
İşletim sistemi GNU / Linux , BSD ( d ) , Microsoft Windows ve macOS
Diller ingilizce
Tür Hata ayıklayıcı
Lisans GPL-3.0 + ( d )
İnternet sitesi www.gnu.org/software/gdb

GNU Debugger da adlandırılan, GDB , olduğustandart ayıklayıcı için GNU Projesi . Birçok Unix benzeri sistemde taşınabilirve C , C ++ , Fortran , Ada , Objective-C ve Go gibi çeşitli programlama dillerinde çalışır. Richard Stallman tarafından 1988'deyazılmıştır. GDB, GNU GPL lisansı altında yayınlanan özgür bir yazılımdır .

Tarih

GDB, GNU Emacs'ın "makul ölçüde kararlı" olarak kabul edilmesinden sonra ilk olarak Richard Stallman tarafından 1986 yılında GNU sistemi ile birlikte yazılmıştır . GDB, GNU Genel Kamu Lisansı (GPL) altında yayınlanan ücretsiz bir yazılımdır . Berkeley'in Unix dağıtımının bir parçası olan DBX hata ayıklayıcıdan esinlenmiştir .

1990'dan 1993'e kadar John Gilmore tarafından sürdürüldü . Şimdi ise Özgür Yazılım Vakfı tarafından kurulan GDB yönlendirme komitesi tarafından sürdürülmektedir .

Özellikler

GDB birçok farklı işlemci mimarisinde çalışır ve geliştirme platformundan ayrı bir hedef platformda çalışan uygulamaların uzaktan hata ayıklamasına (seri bağlantı veya IP bağlantısı yoluyla) izin verir. Bu muhtemelen iki farklı işlemci türünde.

GDB, çalışan bir programın hatalarını ayıklamanıza izin verir (talimatla talimatı aşağı kaydırarak veya verilerini inceleyerek ve değiştirerek), ancak aynı zamanda tamamlanmış bir programın içeriğini temsil eden bir çekirdek dosyayı ayrıştırarak ölüm sonrası hata ayıklamaya da izin verir . Anormal şekilde.

Kullanıcı arayüzleri

GDB'nin arayüzü basit bir komut satırıdır, ancak ona çok daha kullanıcı dostu bir grafik arayüz sağlayan ön uç uygulamalar vardır. Örneğin, ddd yardımcı programı , doğrudan listedeki bir kod satırına tıklayarak oraya bir kesme noktası yerleştirmeyi mümkün kılar, oysa GDB tek başına satır numarasının girilmesini gerektirir. Ayrıca GDB'nin genellikle Eclipse gibi entegre geliştirme ortamları tarafından arka planda çağrıldığını unutmayın .

Uzaktan hata ayıklama

GDB, entegre sistemlerde hata ayıklarken sıklıkla kullanılabilen bir "uzak" mod sunar. Uzaktan işlem, GDB'nin bir bilgisayarda çalışırken ve hata ayıklanan programın başka bir bilgisayarda çalıştırılmasıdır . GDB ayrıca bir seri cihaz veya TCP / IP protokolü aracılığıyla GDB protokolünü anlayan uzak "saplama" ile iletişim kurabilir . İletişim protokolünün hedef tarafını uygulayan GDB ile sağlanan uygun saplama dosyalarına bağlanarak bir değiştirme programı oluşturulabilir. Ayrıca gdbserver'ı programda değişiklik yapmadan uzaktan programda hata ayıklamak için kullanmak da mümkündür .

KGDB , aynı kipi, gdb ile kaynak düzeyinde çalışan bir Linux çekirdeğinin hatalarını ayıklamak için de kullanır. İle KGDB , çekirdek geliştiricileri bir çekirdeğe onlar uygulama programları ayıklamak aynı şekilde hata. Çekirdek koduna kesme noktaları yerleştirmenize, kodda gezinmenize ve ayrıca değişkenleri gözlemlemenize olanak tanır. Donanım hata ayıklama kayıtlarının mevcut olduğu bazı mimarilerde, belirtilen bellek adresleri yürütüldüğünde kesme noktalarını tetikleyen kontrol noktaları tanımlamak mümkündür. KGDB , seri veya Ethernet kablosu kullanılarak hata ayıklanacak bilgisayara bağlı ek bir bilgisayar gerektirir . FreeBSD işletim sisteminde , Firewire belleğine doğrudan erişim kullanarak hata ayıklamak da mümkündür.

Komut örnekleri

gdb programı gdb'yi program "program" ile çalıştırın
çalıştır -v "-v" parametresiyle yüklenen programı başlatın
bt çağrı izlemeyi görüntüler (programın çökmesi durumunda kullanışlıdır)
bilgi kayıtları tüm kayıtları gösterir
el söyle ana işlevi sökün

Kullanım örneği

C ile yazılmış aşağıdaki kaynak kodunu göz önünde bulundurun:

//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen( s ); } int main( int argc, char *argv[] ) { const char *a = NULL; printf( "size of a = %lu\n", foo_len(a) ); return 0; }

Kullanılıyorsa GCC derleyicisi üzerinde Linux , yukarıdaki kod GDB kullanarak kontrol edilmesi için izin oluşturulan ikili hakkında ayıklama uygun bilgileri içerecek şekilde -g bayrağıyla derlenmiş olmalıdır. Yukarıdaki kodu içeren dosyanın example.c olarak adlandırıldığını varsayarsak, derleme komutu şöyle olabilir:

$ gcc exemple.c -Og -g -o exemple

Ve ikili artık çalıştırılabilir:

$ ./exemple Segmentation fault

İkili çalıştırıldığında, bir bölümleme hatası oluşturur, GDB sorunu çözmek için sorunu incelemek için kullanılabilir.

$ gdb ./exemple GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple Program received signal SIGSEGV, Segmentation fault. 0x0000000000400527 in foo_len (s=0x0) at exemple.c:8 8 return strlen (s); (gdb) print s $1 = 0x0

Sorun 8. satırda mevcut ve strlen işlevi çağrılırken ortaya çıkıyor (çünkü argümanı s, NULL). Strlen uygulamasına bağlı olarak (çevrimiçi olsun ya da olmasın) sonuç farklı olabilir, örneğin:

GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/gdb/exemple...done. (gdb) run Starting program: /tmp/gdb/exemple Program received signal SIGSEGV, Segmentation fault. 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 (gdb) bt #0 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 #1 0x08048435 in foo_len (s=0x0) at exemple.c:8 #2 0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at exemple.c:16

Bu sorunu çözmek için, a değişkeni (ana işlevde) geçerli bir dizge içermelidir. Örneğin :

//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen(s); } int main( int argc, char *argv[] ) { //correction ici const char *a = "Hello World!\n"; printf( "size of a = %lu\n", foo_len(a) ); return 0; }

Şimdi ikiliyi GDB ile yeniden derleyip çalıştırırsak, sonuç doğrudur:

GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple size of a = 13 [Inferior 1 (process 14290) exited normally]

GDB, programın normal şekilde sona erdiği standart çıktıda görüntülenir.

Kaynakça

  • (en) Richard Stallman , Roland Pesch , Stan Shebs ve diğerleri , GDB ile Hata Ayıklama: GNU Kaynak Düzeyinde Hata Ayıklayıcı , Özgür Yazılım Vakfı,2012, 10 inci  baskı. , 616  s. ( Mayıs ISBN  978-0-9831592-3-0 )
  • (tr) Arnold Robbins, GDB Cep Referansı , O'Reilly Media,Mayıs 2005, 1 st  ed. , 78  p. ( ISBN  978-0-596-10027-8 , çevrimiçi okuyun )

Ayrıca görün

Notlar ve referanslar

  1. “  İsveç Kraliyet Teknoloji Enstitüsü'nde Richard Stallman konferansı (1986-10-30)  ” ( 9 Ekim 2019'da erişildi )  : “  GNU Emacs makul ölçüde kararlı hale geldikten sonra, bu yaklaşık bir yıl sürdü ve bir buçuk, sistemin diğer kısımlarına geri dönmeye başladım. Son zamanlarda dağıtıma giren C kodu için sembolik bir hata ayıklayıcı olan GDB adını verdiğim bir hata ayıklayıcı geliştirdim. Şimdi bu hata ayıklayıcı, büyük ölçüde Berkeley Unix ile birlikte gelen bir hata ayıklayıcı olan DBX ruhuna uygun.  "
  2. (in) Joel Brobecker, GDB 10.2 yayınlandı!  " ,25 Nisan 2021( 4 Mayıs 2021'de erişildi )
  3. (içinde) "  GDB Yürütme Komitesi  " ( 11 Mayıs 2008'de erişildi )
  4. (in) Norman Matloff ve Peter Jay Salzman , The Art of Debugging with GDB, DDD, and Eclipse , No Starch Press,2008, 264  s. ( ISBN  978-1-59327-174-9 , çevrimiçi okuyun ).

Dış bağlantılar