Programlama hatalarindan dolayi Parcalanma arizasi (Segmentation fault) tespiti ve duzeltilmesi

Başlatan 0xdeadbeef, 02 Haziran 2013 - 18:32:27

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

0xdeadbeef

Merhaba arkadaslar
Yazdigimiz programlarda  bazen parcalanma arizasi adinda hata aliriz. Simdi sizlere dilim dondugunce bu hatalari nasil tespit ederiz ve duzeltiriz onu anlatmaya calisacagim...

Ornek kodumuz:

#include <stdio.h>
#include <string.h>

Int main(int argc, char** argv)
{
char buffer[500];
strcpy(buffer, argv[1]);
printf("Merhaba\n");
return 0;
}

Simdi c kodumuzu derleyelim ve calistiralim
$ gcc -g -o fault fault.c
$ ./fault
Parcalanma Arizasi

Diye hata ciktisi aldik

Not:Bash kabuklarinin default olarak core dosyasi olusturmasi iptal edilmistir...
Simdi biz core dosyasi olusturmasini istiyoruz bash kabugumuzun...Onun icin asagidaki komutu calistiriyoruz...
$ ulimit -c unlimited
Tekrar programimizi  calistiriyoruz.

$ ./fault
Parcalanma arizasi(core dumped)

Programimizin calistigi dizinde core adinda bir dosya olusuyor iste bu dosya bize programin neden hata verdigine dahil bilgiler icermektedir...
Simdi gdb yardimi ile programi ve core dosyamizi calistiriyoruz
$ gdb ./fault core
GNU gdb ()GDB 7.4.1-debian
Warning: Can't read pathname for load map:Girdi/Cikti hatasi.
Core was generated by './fault'.
Program terminated with signal 11, Segmentation fault.
#0 0xb7620b80 in strcpy () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
(Gdb)q

Programin strcpy fonksiyonunu kullanirken coktugunu biliyoruz artik.
Simdi kodumuza gelip duzeltme yapip tekrar derlememiz gerekiyor...
Hata komuzu duzenliyoruz.
strcpy(buffer, argv[0]);
Olarak duzenledik,tekrar derliyoruz ve calistiriyoruz...

$ gcc -g -o fault fault.c
$ ./fault
Merhaba

Evet programimiz hatasiz bir sekilde calisti.
Simdi herhangi bir uygulamadaki hatalari nasil tespit ederiz ona da bir not duselim.
Ucbirimde
$ tail -f /var/log/messages
Komutunu calistiralim ve diger ucbirimde de hatali uygulamayi calistiralim
Ornek uygulama
$ ./fault
Parcalanma arizasi

Simdi tail komutu calisan ucbirim ciktisi
Jun 2 18:45:14 CrazyWolf kernel:[91125.508898 fault[13690]: segfault at 0 ip b75e1b80 sp bfc1a100 error 4 in libc-2.13.so[b75690000+15c0000]

umarim yararli bir paylasim olmustur...
Video:
http://www.dosya.tc/server10/PCNsXB/fault1.zip.html
Boyut:5.42 mb
Amac balik vermek degil, balik tutmasini ogretmek...

sem

Paylaşım için teşekkürler.

Bir çok kişi gdb'yi pek kullanmadan uygulama geliştiriyor... Gerçi konsoldan uygulama geliştirenler zaten az, bunun dışında IDE'ler de gdb ile entegre çalışabildiği için bir çok kişi dgb kullandığını dahi bilmeyebiliyor.

gdb ile aranız nasıldır bilemiyorum tabi, benim SUDO'da çok uzun zamandır yazmak istediğim fakat zaman bulamadığım bir konu aslında kendisi. Eğer temel olarak kullanımını anlatabilirim derseniz, seve seve SUDO'nun geliştirme ile ilgili yazısı olarak yayınlayabiliriz.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

0xdeadbeef

@sem0900 Gercekten bende cok sevinirim. Elimden geldigince faydali bir dokuman hazirlamaya calisacagim..Ayrica konuya ilginizden dolayi da tesekkur ederim.



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 04 Haziran 2013 - 17:09:00

@sem0900 Gdb dokumanimi hazirladim ve size ilettim ancak mail servisindeki sorunlar nedeni ile mail gec gelebilir. Eger mail adresinize ulasmazsa geri donus yapabilirmisiniz tekrar dan gondermeyi deneyecrgim cunku.
Bilgilerinize...
Amac balik vermek degil, balik tutmasini ogretmek...

sem

Merhabalar,

Mail ile dönüş yaptım. Mailiniz bana ulaştı. Şimdiden ellerinize sağlık. Yarın okuyarak yorumlarımı size iletmiş olacağım. Görüşmek üzere, iyi çalışmalar.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?