Welcome, Guest. Please login or register.
Did you miss your activation email?
08 February, 2012, 10:05:36 am
Home Help Search Login Register

Lazarus and FreePascal

Erişim

Stats

Members
  • Total Members: 1208
  • Latest: yuksek
Stats
  • Total Posts: 326
  • Total Topics: 83
  • Online Today: 10
  • Online Ever: 53
  • (22 October, 2011, 06:01:43 pm)
Users Online
Users: 0
Guests: 11
Total: 11
Oct 16 2009 GDB Kullanımı
written by alivardar | 3782 Views | Rating: (0 rates)
Dökümanlar
M.Ali VARDAR – 2005 GNU Debugger Kullanımı
GDB Kullanımı
Uygulamalarımızı geliştirme sırasında gerek sistemden olsun gerek programcı tarafından
olsun gelen bir takım sinyaller veya kesmeler veya hatalar yüzünden uygulamamızın
çalışmasında kesilmeler olabilir. Bu gibi zamanlarda çoğu zaman tahmin edebiliyor
olmak yeterli olmayabilir. Bu gibi durumlarda en büyük yardımcımız gdb olacaktır. Linux
sistemlerde yaygın olarak gnu debugger isimli uygulama kullanılır. Bu uygulama ile
uygulamanızın kodu veya core dosyası incelenebilir. Öncelikle derleme işlemine bir
bakalım.
gcc -g deneme.c -o deneme
Derleme işleminden sonra uygulamanın normal -g parametresiz büyüklüğünden fazla
olduğu görülecektir. Bu aşamadan sonra derlenen uygulama debug işlemleri için gerekli
olan açıklamaları da binary içerisine katmaktadır. Hata veren örnek bir uygulama
yazalım. Örnek uygulama içerisinde değişiklik yapalım ve ugulamanın hata vermesini
sağlayalım.
int main()
{
int a[5];
int i=0;
duzenle(a);
}
void duzenle(int a[])
{
int i;
for (i=0;i<10000;i++) a[i]=i;
}
Uygulamamız
for (i=0;i<9000;i++) a[i]=i;
satırında hata vermektedir. Çünkü bu satırda hafıza için ayrılmış olan 5 integer
miktarındaki alana 10000 nci integer değerine erişilmeye çalışılmaktadır. Uygulama ilk
çalıştırıldığı anda segmentation failed hatası verecektir. Bu kadar kısa bir kod içerisinde
bunu bulmak sorun olmayacaktır. Ancak uygulamanında iç içe çağrımlarda bulunan
100.000 satır bir uygulama olduğunu düşünürseniz bu gibi bir hatanın bulunması
programcıyı epey zorlayacaktır. Uygulamaya tekrar geri dönelim uygulamayı şimdi
aşağıdaki şekilde çalıştıralım.
[root@linuxprogramlama 1]# gdb deneme
GNU gdb Red Hat Linux (5.1.90CVS-5)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are welcome to change it and/or distribute copies of it under
certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-redhat-linux"...
(gdb)
gdb ilk çalıştığı zaman yukarıdaki şekilde bir karşılama mesajı karşımıza çıkacaktır.
Uygulama çalıştırılabilir dosyası gdb yüklenmiş olacaktır. Uygulama r komutu ile
çalıştıralım ve karşımıza çıkan mesaja bir bakalım.
(gdb) r
M.Ali VARDAR – 2005 GNU Debugger Kullanımı
Starting program: /Projects/Kurs/1/deneme
Program received signal SIGSEGV, Segmentation fault.
0x08048418 in duzenle (a=0xbffff970) at deneme.c:12
12 for (i=0;i<9000;i++) a[i]=i;
İşte gdb bize hata veren satırımızı ekrana yazdı. Açıklamanın başında bulunan 12 rakamı
bize uygulama kodumuz içerisinde hatayı veren satırdır. Şimdi hatanın oluşma süreçlerine
bakalım bu amaçla bt (backtrace) komutunu kullanıyoruz.
(gdb) bt
#0 0x08048418 in duzenle (a=0xbffff970) at deneme.c:12
#1 0x080483e9 in main () at deneme.c:6
#2 0x0000000b in ?? ()
Cannot access memory at address 0xa
(gdb)
Böylece en sade halde uygulamamızda bulunan hataları izleme yöntemini gördük. Şimdi
de daha etkin bir şekilde GNU debugger kullanabilmek amacıyla bir takım komutlara
göz atalım.
list komutu bize hataya neden olan satırın bulunduğu komut listesini verecektir.
(gdb) list
7 }
8
9 void duzenle(int a[])
10 {
11 int i;
12 for (i=0;i<9000;i++) a[i]=i;
13 }
(gdb)
Değişkenler hakkında bilgi almak için print komutu kullanılır.
(gdb) print a[5]
$2 = 5
(gdb)
Değişken tipini öğrenmek için whatis komutu kullanılır.
(gdb) whatis a
type = int *
Peki bir koşul oluşması durumunda istenen değişken bilgilerini almak istesek ne
yapmamız gerekir bu amaçla uygulamanın çalışma anında durdurulmasını sağlayacak bir
kırılma noktası yerleştirmeliyiz.
(gdb) break 12
Breakpoint 1 at 0x80483f6: file deneme.c, line 12.
(gdb) r
Starting program: /Projects/Kurs/1/deneme
Breakpoint 1, duzenle (a=0xbffff970) at deneme.c:12
12 for (i=0;i<9000;i++) a[i]=i;
(gdb) print i
$1 = 0
yukarıdaki şekilde 12 satıra bir kırılma noktası yerleştirdik ve o anki
i değerine baktık diğer bir şartlı kırılma noktasına örnek ise;
(gdb) break 12 if i==5
Breakpoint 1 at 0x80483f6: file deneme.c, line 12.
(gdb)
görüldüğü üzere i değişkeni 12 satırda 5 değerine ulaştığı an uygulama kesilecektir.
M.Ali VARDAR – 2005 GNU Debugger Kullanımı
Makina dili kodlarını kodlarını öğrenmek için verilen iki bellek arasını yazdırmak için
(gdb) disas 0x63e4 0x6404
Dump of assembler code from 0x63e4 to 0x6404:
0x63e4 : ble 0x63f8
0x63e8 : sethi %hi(0x4c00), %o0
0x63ec : ld [%i1+4], %o0
0x63f0 : b 0x63fc
0x63f4 : ld [%o0+4], %o0
0x63f8 : or %o0, 0x1a4, %o0
0x63fc : call 0x9288
0x6400 : nop
End of assembler dump.
Kesilmiş olan yerden devam etmek aşağıdaki gibi c komutu vermek gereklidir.
(gdb) c
Continuing.
Debugger dan çıkmak için quit veyahutta q yazınız. Aynı zamanda uygulamanızın core
dosyasını da #gdb programcoredosyasi şeklinde kullanarak hata veren yeren yeri
bulabilirsiniz
M.Ali VARDAR – 2005 Ocak
ali@linuxprogramlama.com
www.linuxprogramlama.com
Yasal Açıklama:
Bu belgenin, [GDB Kullanımı] 1.0 sürümünün telif hakkı © 2005 M. Ali
Vardar'a aittir. Bu belgeyi, Free Software Foundation tarafından
yayınlanmış bulunan GNU Özgür Belgeleme Lisansının 1.1 ya da daha
sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir
ve/veya değiştirebilirsiniz. Bu Lisansın bir kopyasını
http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz.
BU BELGE "ÜCRETSİZ" OLARAK RUHSATLANDIĞI İÇİN, İÇERDİĞİ BİLGİLER İÇİN
İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ
VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF HAKKI
SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR BELGEYİ "OLDUĞU GİBİ", AŞİKAR VEYA
ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA DAHİL
OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR. BİLGİNİN
KALİTESİ İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. HERHANGİ BİR HATALI
BİLGİDEN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA DÜZELTME
MASRAFLARI SİZE AİTTİR. İLGİLİ KANUNUN İCBAR ETTİĞİ DURUMLAR VEYA
YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF HAKKI SAHİBİ VEYA
YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE BELGEYİ DEĞİŞTİREN VEYA YENİDEN DAĞITAN
HERHANGİ BİR KİŞİ, BİLGİNİN KULLANIMI VEYA KULLANILAMAMASI (VEYA VERİ
KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE GELMESİ, SİZİN VEYA ÜÇÜNCÜ
ŞAHISLARIN ZARARA UĞRAMASI VEYA BİLGİLERİN BAŞKA BİLGİLERLE UYUMSUZ
OLMASI) YÜZÜNDEN OLUŞAN GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ
BİR ZARARDAN, BÖYLE BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ
KİŞİYE BİLDİRİLMİŞ OLSA DAHİ, SORUMLU DEĞİLDİR.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir.
Belge içinde geçen herhangi bir terim, bir ticari isim ya da kuruma
itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın
kullanılmış olması ona onay verildiği anlamında görülmemelidir.
Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon

Forum / Destek

GPL Applications

TinyPortal v1.0 beta 4 © Bloc


Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!