GNU Hata Ayıklayıcı
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 .
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 .
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.
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 .
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.
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 |
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 exempleVe 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 = 0x0Sorun 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:16Bu 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.