GNU Hata Ayıklayıcı - GNU Debugger
Geliştirici(ler) | GNU Projesi |
---|---|
İlk sürüm | 1986 |
kararlı sürüm | 11.1 / 13 Eylül 2021
|
depo | |
Yazılmış | C |
İşletim sistemi | Unix benzeri , Windows |
Tip | hata ayıklayıcı |
Lisans | GPLv3 |
İnternet sitesi | www |
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 -g
bö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:
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 size of a = 21 [Inferior 1 (process 14290) exited normally]
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
- İkili Dosya Tanımlayıcı kitaplığı (libbfd)
- dbx
- DDD , GDB ve diğer hata ayıklayıcılar için bir GUI
- gdbserver
- LLDB
Referanslar
Dış bağlantılar
- Resmi internet sitesi
- UltraGDB: Windows ve Linux'ta GDB ile Visual C/C++ Hata Ayıklama
- KGDB: Linux Çekirdeği Kaynak Düzeyi Hata Ayıklayıcı
- Kore dilinde "MyGDB: GDB Frontend" web sitesi
- GDB ile hata ayıklamak için bir Visual Studio eklentisi
- GDB ön uçlarının karşılaştırması, 2013
- Eclipse'i GDB Hata Ayıklayıcısına Ön Uç Olarak Kullanma
belgeler
- Richard M. Stallman , Roland Pesch , Stan Shebs ve diğerleri, GDB ile Hata Ayıklama ( Free Software Foundation , 2011) ISBN 978-0-9831592-3-0
- GDB Dahili
öğreticiler
- RMS'nin gdb Eğitimi (Ryan Michael Schmidt, Richard Matthew Stallman değil)
- GDB Eğitimi