GNU Hata Ayıklayıcı - GNU Debugger

GNU Hata Ayıklayıcı
GDB Okçu Balığı, Andreas Arnez.svg
GDB-ekran görüntüsü.gif
Geliştirici(ler) GNU Projesi
İlk sürüm 1986 ; 35 yıl önce ( 1986 )
kararlı sürüm
11.1 / 13 Eylül 2021 ; 1 gün önce ( 2021-09-13 )
depo
Yazılmış C
İşletim sistemi Unix benzeri , Windows
Tip hata ayıklayıcı
Lisans GPLv3
İnternet sitesi www .gnu .org /yazılım /gdb

GNU Debugger ( GDB ) bir olduğunu taşınabilir ayıklayıcı bu konuda çalışır birçok Unix benzeri birçok sistem ve eserleri programlama dilleri de dahil olmak üzere, Ada , C , C ++ , Objective-C , Free Pascal , Fortran , Go ve kısmen diğerlerine.

Tarih

GDB ilk olarak 1986'da Richard Stallman tarafından GNU sisteminin bir parçası olarak , GNU Emacs'i "makul ölçüde kararlı" olduktan sonra yazılmıştır . GDB, GNU Genel Kamu Lisansı (GPL) altında yayınlanan ücretsiz bir yazılımdır . Berkeley Unix dağıtımlarıyla birlikte gelen DBX hata ayıklayıcısından sonra modellenmiştir .

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

Teknik detaylar

Özellikleri

GDB, bilgisayar programlarının yürütülmesini izlemek ve değiştirmek için kapsamlı olanaklar sunar . Kullanıcı, programların dahili değişkenlerinin değerlerini izleyebilir ve değiştirebilir ve hatta programın normal davranışından bağımsız olarak işlevleri çağırabilir .

GDB hedef işlemcileri (2003 itibariyle) şunları içerir: Alpha , ARM , AVR , H8/300 , Altera Nios/Nios II , System/370 , System 390 , X86 ve 64-bit uzantısı X86-64 , IA-64 "Itanium" , Motorola 68000 , MIPS , PA-RISC , PowerPC , SuperH , SPARC ve VAX . Standart sürümde desteklenen daha az bilinen hedef işlemciler arasında A29K , ARC , ETRAX CRIS , D10V , D30V , FR-30 , FR-V , Intel i960 , 68HC11 , Motorola 88000 , MCORE , MN10200 , MN10300 , NS32K ve , Stormy16 , Z8000 . (Yeni sürümler muhtemelen bunlardan bazılarını desteklemeyecektir.) GDB, M32R veya V850 gibi daha az bilinen hedef işlemciler için bile simülatörler derlemiştir .

GDB hala aktif olarak geliştirilmektedir. Sürüm 7.0'dan itibaren yeni özellikler Python komut dosyası oluşturma desteğini ve 7.8 sürümünden itibaren GNU Guile komut dosyası oluşturmayı da içerir. 7.0 sürümünden bu yana, "tersine çevrilebilir hata ayıklama" desteği - ne olduğunu görmek için çöken bir programı geri sarmaya çok benzer şekilde, bir hata ayıklama oturumunun geriye doğru gitmesine izin verir - mevcuttur.

Uzaktan hata ayıklama

GDB, gömülü sistemlerde hata ayıklarken sıklıkla kullanılan bir "uzak" mod sunar. Uzaktan çalıştırma, GDB'nin bir makinede çalıştığı ve hata ayıklanan programın başka bir makinede çalıştığı zamandır. GDB, bir seri cihaz veya TCP/IP 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 saplama programı oluşturulabilir. Alternatif olarak, herhangi bir şekilde değiştirmeye gerek kalmadan programda uzaktan hata ayıklamak için gdbserver kullanılabilir.

Aynı mod, KGDB tarafından gdb ile kaynak düzeyinde çalışan bir Linux çekirdeğinde hata ayıklamak için de kullanılır . KGDB ile çekirdek geliştiricileri, uygulama programlarında hata ayıkladıkları gibi bir çekirdeğin hatalarını ayıklayabilir. Çekirdek koduna kesme noktaları yerleştirmeyi, kodda adım adım ilerlemeyi ve değişkenleri gözlemlemeyi mümkün kılar. Donanım hata ayıklama kayıtlarının mevcut olduğu mimarilerde, belirtilen bellek adresleri yürütüldüğünde veya bunlara erişildiğinde kesme noktalarını tetikleyen izleme noktaları ayarlanabilir. KGDB, seri kablo veya Ethernet kullanılarak hata ayıklanması için makineye bağlı ek bir makine gerektirir . On FreeBSD , kullanarak hata ayıklamak da mümkündür FireWire doğrudan bellek erişimi (DMA).

Grafiksel kullanıcı arayüzü

Hata ayıklayıcı kendi grafik kullanıcı arabirimini içermez ve bir metin kullanıcı arabirimi içermesine rağmen varsayılan olarak bir komut satırı arabirimini kullanır . Bunun için UltraGDB , Xxgdb , Veri Görüntüleme Hata Ayıklayıcı (DDD), Nemiver , KDbg , Xcode hata ayıklayıcı, GDBtk/Insight ve HP Wildebeest Hata Ayıklayıcı GUI (WDB GUI) gibi çeşitli ön uçlar oluşturulmuştur . IDE gibi CodeLite , Code :: Blocks , Dev-C ++ , Geany , Studio Programlama TBMM (GPS), kdevelop , Qt Creator , Lazarus , MonoDevelop , Eclipse , NetBeans ve Visual Studio GDB ile arayüz oluşturabilir. GNU Emacs bir "GUD modu"na sahiptir ve VIM için araçlar mevcuttur (örneğin clewn). Bunlar, IDE'lerde bulunan hata ayıklayıcılara benzer olanaklar sunar.

Diğer bazı hata ayıklama araçları, bellek sızıntısı algılayıcıları gibi GDB ile çalışacak şekilde tasarlanmıştır .

Dahili

GDB , başka bir işlemin yürütülmesini gözlemlemek ve kontrol etmek ve işlemin belleğini ve kaydını incelemek ve değiştirmek için ptrace adlı bir sistem çağrısı (adı "işlem izleme" nin kısaltmasıdır) kullanır. Genel gdb komutlarının bir listesi ve ilgili ptrace çağrıları aşağıda listelenmiştir:

  • (gdb) start : PTRACE_TRACEME – ebeveyni izleyici yapar (tracee tarafından çağrılır)
  • (gdb) PID ekle: PTRACE_ATTACH – çalışan bir sürece ekle
  • (gdb) dur: kill(child_pid, SIGSTOP) (veya PTRACE_INTERRUPT)
  • (gdb) devam: PTRACE_CONT
  • (gdb) bilgi kayıtları: PTRACE_GET(FP)REGS(ET) ve PTRACE_SET(FP)REGS(ET)
  • (gdb) x : PTRACE_PEEKTEXT ve PTRACE_POKETEXT

Belirli bir bellek adresindeki bir talimatın başka bir özel talimatla değiştirilmesiyle bir kesme noktası uygulanır. Kesme noktası talimatının yürütülmesi SIGTRAP'a neden olur.

komut örnekleri

gdb program "Program" hatalarını ayıklayın (kabuktan)
run -v Yüklenen programı parametrelerle çalıştırın
bt Geri izleme (programın çökmesi durumunda)
info registers Tüm kayıtları boşalt
disas $pc-32, $pc+32 sökmek

Örnek bir oturum

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

#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) );

  exit( 0 );
}

Kullanılması GCC üzerinde derleyici Linux , kod yukarıdaki kullanılarak derlenmesi gerekir -gböylece mümkün GDB kullanarak bunu incelemek için yapım oluşturulan ikili üzerinde uygun ayıklama bilgileri içerecek amacıyla bayrağı. Yukarıdaki kodu içeren dosyanın adlandırıldığını varsayarsak example.c, derleme komutu şöyle olabilir:

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

Ve ikili şimdi çalıştırılabilir:

$ ./example
Segmentation fault

Örnek kod yürütüldüğünde bir segmentasyon hatası oluşturduğundan , sorunu incelemek için GDB kullanılabilir.

$ gdb ./example
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/example...done.
(gdb) run
Starting program: /path/example

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400527 in foo_len (s=0x0) at example.c:8
8	  return strlen (s);
(gdb) print s
$1 = 0x0

Sorun 8. satırda mevcut ve işlev çağrılırken ortaya çıkıyor strlen(çünkü argümanı , s'dir NULL). strlen'in uygulanmasına bağlı olarak ( satır içi veya değil), çıktı 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/example...done.
(gdb) run
Starting program: /tmp/gdb/example

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 example.c:8
#2  0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at example.c:16

Sorunu çözmek için değişkenin a( işlevindeki main) geçerli bir dize içermesi gerekir. İşte kodun sabit bir versiyonu:

#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 = "This is a test string";

  printf( "size of a = %lu\n", foo_len(a) );

  exit( 0 );
}

Yürütülebilir dosyayı yeniden GDB içinde yeniden derlemek ve çalıştırmak artık doğru bir sonuç veriyor:

GDB printf, ekrana çıktısını yazdırır ve ardından kullanıcıya programın normal olarak çıktığını bildirir.

Ayrıca bakınız

Referanslar

Dış bağlantılar

belgeler

öğreticiler