C++'da Segmentasyon Hatasının Nedeni Nasıl Bulunur?

C Da Segmentasyon Hatasinin Nedeni Nasil Bulunur



Segmentasyon hatası olarak da bilinen segmentasyon hatası, bir program erişim yetkisinin olmadığı bir bellek bölümüne ulaşmaya çalıştığında meydana gelen bir tür hatadır. Bir segmentasyon hatası oluştuğunda, işletim sistemi daha fazla soruna neden olmasını önlemek için programı sonlandırır. Bu hata genellikle program kodundaki, başlatılmamış bir işaretçiye erişim, boş bir işaretçinin referansının kaldırılması veya bir dizinin sınırlarının ötesine geçme gibi bir programlama hatasını veya bir hatayı gösterir.

Segmentasyon hatalarının hata ayıklaması zor olabilir çünkü bunlar genellikle ayrıntılı hata mesajları vermeden çökmelere neden olur. Ancak GDB (GNU Hata Ayıklayıcı) gibi araçlar, hata anında programın durumunu ve yığın izini inceleyerek bölümleme hatasının kaynağının belirlenmesine yardımcı olabilir.

Segmentasyon hatalarının genellikle programlama hatalarından kaynaklandığını ve hata olarak kabul edildiğini unutmamak önemlidir. Sorunlu kod incelenip düzeltilerek bunların düzeltilmesi gerekir. Segmentasyon hatalarının yaygın nedenleri arasında şunlar bulunur:







  • Boş veya başlatılmamış işaretçilerin referansının kaldırılması
  • Bir dizinin sınırları dışında yazma veya okuma
  • Daha önce serbest bırakılmış veya serbest bırakılmış bir belleği kullanma
  • Yığın taşması veya yığın bozulması
  • Başlatılmamış değişkenleri kullanma

Kodunuzu dikkatlice inceleyerek ve GDB gibi hata ayıklama araçlarını kullanarak segmentasyon hatalarını tespit edip düzeltebilir, programınızın doğru çalışmasını ve bu hatalarla karşılaşmamasını sağlayabilirsiniz.



GDB Hata Ayıklayıcı

GDB (GNU Hata Ayıklayıcı), derlenmiş programlardaki bölümleme hataları dahil sorunları tanımlamaya ve analiz etmeye yardımcı olan güçlü bir hata ayıklama aracıdır. Programın durumunu incelemenize, kesme noktalarını tetiklemenize ve yürütme akışını gözlemlemenize olanak tanır.



Segmentasyon hatalarında hata ayıklamak amacıyla GDB'yi etkili bir şekilde kullanmak için, C++ programınızı etkin hata ayıklama sembolleriyle derlemeniz gerekir. Bu semboller programın yapısı, değişkenleri ve hata ayıklama sürecine yardımcı olan işlevler hakkında ek bilgiler içerir.





GDB ile C++'da Segmentasyon Hatasını Bulma

Segmentasyon hatasına neden olan örnek bir kod pasajını burada bulabilirsiniz:

#include

int ana ( ) {

int * ptr = nullptr ;

* ptr = 5 ;

geri dönmek 0 ;

}

Öncelikle kodu açıklayalım. Daha sonra önceki kodda segmentasyon hatası bulma konusunu adım adım ele alacağız.



“#include ” önişlemci yönergesi, C++'ta hem girdi hem de çıktı akışı özelliklerini sunan gerekli başlık dosyasını ekler.

Main() fonksiyonunun içinde, int* tipinde bir işaretçi değişkeni “ptr”nin bildirimi vardır. “Nullptr” değeri, işaretçinin herhangi bir noktaya işaret etmediğini belirten özel bir boş işaretçi değeri olan işaretçinin başlatılması olarak kullanılır. geçerli hafıza konumu.

Takip eden satırda “*ptr = 5;” olan boş gösterici “ptr” ile referans kaldırma denemeleri yapılır. Bu durumda “ptr” “nullptr” olarak ayarlandığından erişilebilecek geçerli bir hafıza konumu bulunmamaktadır.

Şimdi segmentasyon hatasını bulmak amacıyla programı derlemek için izlenmesi gereken bazı adımları tartışacağız.

1. Adım: Hata Ayıklama Sembollerini Etkinleştirin

Başlamak için C++ programınızı etkin hata ayıklama simgeleriyle derlediğinizden emin olun. Derleme sırasında yürütülebilir dosyaya hata ayıklama bilgisi sağlamak için “-g” bayrağını kullanın. “Main.cpp” adında bir C++ dosyamızın olduğu durumu düşünün.

$ g++ -G ana.cpp ana

Adım 2: GDB'yi çalıştırın

Program hata ayıklama sembolleriyle derlendikten sonra yürütülebilir dosyayı argüman olarak ileterek GDB'yi çalıştırın.

$ gdb ana

Adım 3: Programı Başlatın

GDB istemine “run” veya “r” yazarak programı başlatın:

$ ( gdb ) koşmak

Daha sonra programınız çalışmaya başlayacaktır.

Adım 4: Segmentasyon Hatasını Tanımlayın

Program segmentasyon hatasıyla karşılaşıncaya kadar çalışmaya devam eder. Daha sonra program çalışmayı durdurur ve GDB bir hata mesajı üretir.

Örneğin: daha önce açıkladığımız kodu ele alalım; burada boş göstericinin gösterdiği bellek konumuna 5 değerini atamaya çalıştığımızda bu bir segmentasyon hatasıyla sonuçlanır. Program, segmentasyon hatasının oluştuğu satırda hemen sonlandırılır.

Bu programı GDB ile çalıştırdığınızda aşağıdakine benzer bir çıktı göreceksiniz:

Bu çıktı, “main.cpp” dosyasının 5. satırındaki ana fonksiyonda bir segmentasyon hatası oluştuğunu gösterir.

Adım 5: Yığın İzlemeyi İnceleyin

Segmentasyon hatasına ilişkin daha fazla bilgi edinmek için 'backtrace' komutunu veya basitçe 'bt' komutunu kullanarak yığın izini inceleyebilirsiniz. Bu komut, çökmeye yol açan işlev çağrılarının sırasını görüntüler.

$ ( gdb ) ama

Segmentasyon hatasından önce çağrılan fonksiyonları gösteren yığın izleme görüntülenir:

Bu çıktı bize “main.cpp” dosyasının 5. satırındaki ana fonksiyonda segmentasyon hatasının oluştuğunu bildirir.

Adım 6: Kesme Noktalarını Ayarlayın

Daha fazla araştırma yapmak için, programın yürütülmesini bu noktalarda durdurmak üzere belirli kod satırlarına kesme noktaları ayarlayabilirsiniz. Bu, programın durumunu ve değişkenlerini incelemenizi sağlar. Örneğin “main.cpp” dosyasının 5. satırına bir kesme noktası ayarlamak için “break” komutunu aşağıdaki gibi kullanın:

$ ( gdb ) kırmak main.cpp: 5

Bu, “main.cpp” dosyasının 5. satırında bir kesme noktası belirler:

Adım 7: Yürütmeyi Sürdürün

Kesme noktalarını ayarladıktan sonra, 'devam et' komutunu veya yalnızca 'c' komutunu kullanarak programın yürütülmesine devam edin:

$ ( gdb ) devam etmek

Program kesme noktasına ulaşana kadar çalışmaya devam eder.

Adım 8: Değişkenleri ve Kodu İnceleyin

Program bir kesme noktasında durduğunda değişkenleri incelemek, kodda ilerlemek ve segmentasyon hatasının nedenini araştırmak için çeşitli GDB komutlarını kullanabilirsiniz.

Adım 9: GDB'den çıkın

Hata ayıklamayı bitirdikten sonra “quit” komutunu kullanarak GDB'den çıkabilirsiniz:

$ ( gdb ) çıkış yapmak

Bu, C++ programlarındaki segmentasyon hatalarını bulmak için GDB kullanımına ilişkin temel bir genel bakış sağlar. GDB, hata ayıklamaya yardımcı olabilecek daha birçok özellik ve komut sağlar ve daha ayrıntılı bilgi için GDB belgelerine başvurabilirsiniz.

Çözüm

Bu makale, C++'da segmentasyon hatasını bulmak için GDB'nin kullanımını göstermektedir. Takip edilmesi gereken adımları sizlere anlattık. Bu adımlar, GDB kullanarak C++'da bir segmentasyon hatasının nasıl bulunacağına ilişkin kapsamlı bir açıklama sağlar. Bu adımları izleyerek ve GDB'nin özelliklerini kullanarak, C++ programınızdaki segmentasyon hatasının kaynağını etkili bir şekilde bulabilir ve hata ayıklayabilirsiniz.